テキストファイル中の変数を展開するには?

[上に] [前に] [次に]
吉本まー 2000/06/07(水) 12:03:28
今、perlでcgiを作っています。
HTMLの書式に準じて書かれたテンプレートファイルを読み込んできて、それを整形して標準出力に出してやるというものです。
(テンプレートは例えばこんな感じ)

<html>
あなたの価値は $value 円です。
あと $years 年生きられます。
</html>

(以上)
この $value や $years がcgiの中で使われていたらその値に置き換え、使われていなければ削除して出力ということがやりたいのです。
めっちゃ煮詰まってます。どなたかよろしくお願いします。

D.D. 2000/06/07(水) 12:08:02
その為の「if」だと思った。

バギンズ 2000/06/07(水) 12:16:40
ここの下の方に同じ様な内容があります。

http://www.tohoho-web.com/lng/r200006/00060022.htm

吉本まー 2000/06/07(水) 12:27:51
すみません、訂正します。

・テンプレート中にある変数は、事前には決まっていません。
 例では$value、$yearsと書いてますが、$asdklかもしれないし、
 $qwertyかもしれない。
・テンプレート中の変数は、${文字列}という形で書いています。

(以下)
<html>
あなたの価値は ${value} です。
あと ${years} 生きられます。
</html>
(以上)

を読み込んできてcgiの中で $value や $years がundefじゃなければ、
その値に置き換えて出力、ということです。
だから、ifで$valueがあるかないか、$yearsがあるかないかをチェック
するという話ではないのです。
正規表現で${****}を切り出すところまではうまくいったのですが。

andi 2000/06/07(水) 12:31:42
../200003/00030022.htm

D.D. 2000/06/07(水) 12:34:16
じゃあ、「{」とか「}」を取り除いてundefかどーかをチェックすればいいと思う。

吉本まー 2000/06/07(水) 12:35:31
>バギンズさん

 そうです。大体こういうようなことをやりたいのです。
 変数名が確定してない場合はどうしたらいいのかな、と。

 で、
  s/\${([^}]*)}/$$1/g
 なんの根拠も無くこうかなーと思って書いてみたんですが、だめで。

sadahiro 2000/06/07(水) 15:32:12
変数名はまだ決まっていないとしても最終的には決めるおつもりかと。
そうでないとCGIのクライアントが困ってしまいます。
ご質問の最初にある通り、変数に値が入っていなければ削除するということなら
(もっとも値が入っていないことがないようにすべきなのだが)
こんなかんじでしょう。 s///e; の e がなくてはいけません。

$years=50;
$value='そこそこ';
open IN, "tmp.htm";
while (<IN>){
s/\$\{([^}]*)\}/${$1}/eg;
print;
}
出力
<html>
あなたの価値は そこそこ です。
あと 50 年生きられます。
</html>

吉本まー 2000/06/08(木) 09:00:06
[[解決]]
 解決しました。
 D.D.さん、バギンズさん、andiさん、sadahiroさんありがとうございました。

 sadahiroさんのソースそのままでやるとできるのに、どうして、自分のほうで
組み込んでやるとできないのかな、とずっとあれこれやっていたのですが、最
終的に
 ・strictライブラリを組み込んでいた。
 ・myで初期化するとだめらしい。
 ということに気が付きました。
 myとlocalについても理解が足りなかったようです。

 あと、andiさんの書き込みは今朝になって気がつきました(えらく失礼)
 まるっきりおんなじ質問が出ていたのですね。お手を煩わせました。

 お返事くれた方、どうもありがとうございました。
 また質問することもあると思いますが、そのときもよろしくお願いします。

 それでは。

[上に] [前に] [次に]