Perlの小箱掲示板 いたずら スパム ブロック 方法 漢字コード 変換 EUC
その5:変数がハッシュ配列になっているHTML文の展開
かなり暫くぶりの Perlテーマ 実は現在、重い腰を上げて e日記の改造を始めたところ。 改造の幹の部分ではないが、元祖 日記のCGIは HTML部分を全てメインプログラム中に書き下しているためにかなり可読性が悪い。 そこでまとまったHTML部分を、幾つかの外部データファイルとして保存しておき そのデータファイルを必要に応じて読み込んで print文で出力させようと思った。 しかし、やってみると 案外てこずった。問題は HTML中の文字サイズや色情報などかなり多くのパラメータが
$Sys{'key1'} = 'red';
のようなハッシュ配列に格納されており、それらの配列をまとめて %Sysとして処理する部分があること。オリジナルの場合
・・・・ $Sys{'keyXX'} = '32';
print "font-size:$Sys{'key13'}pt"
のようにそのまま print文中に記述すれば、perlの場合は対応した値が代入されて出力されるので非常に簡潔に書ける。しかし、これを外部ファイルに記憶させて、配列に読み込んで
open (IN,file_name);
としただけでは、文字列変数が値に展開されず、変数名のまま出力されてしまう事が分かった。@htmlstr = <IN>; close (IN); foreach $outstr(@htmlstr){ print "$outstr"; } Webで検索すると、大方のやり方は
#!/usr/bin/perl -w
という具合に、外部モジュールを使うと書いてある。しかし、この方法が上記のようなハッシュの変数名に対応しているのかどうか良く分からない。やってみればいいのだが、イマイチ回りくどいような気がして試さずに、他の方法があるのではと執拗に探してみた。use HTML::Template; 結果は「吉」 どうやら eval 関数が使えるらしいと書いたページに行きついた。 例えば、ハッシュの変数要素($Sys{'keyXX'})を表す正規表現 「\$\w+\{\'\w+\'\}」を用いて検索し、置換する文字列を eval($1)で戻してやる。
foreach $outstr(@htmlstr){
というような感じで、見事? パラメータが展開された。
$prt_str =~ s/(\$\w+\{\'\w+\'\})/eval($1)/eg; }
|