MVC モデルに慣れ親しんだせいで、画面とロジックを共存させる旧来の perl のやり方が、スゲーうさん臭く思えていた。それだけに HTML::Template モジュールとの出会いは衝撃的。もう、これ無しで perl を使ったWebアプリなんざ作れないっすよ、お兄さん!
そんな愛しの HTML::Template モジュールのなかでも、とりわけ重宝しているのが、loop_context_vars オプション。jsp とか velocity だと、計算のロジック入れないといけない二段組が、スゲー簡単に実現できたりする。かゆいところに手が届いていて良い感じ。素敵です。
以下、サンプルソース。
■CGI 側
#!/usr/local/bin/perl -w
use HTML::Template; my $template = HTML::Template->new(filename => 'index.tmpl',loop_context_vars => 1);
my @dataList = (); for(my $i = 0; $i < 9; $i++) { my %tmp; $tmp{'DATA'} = $i; push(@dataList, \%tmp); } $template->param(LIST => \@dataList);
print "Content-Type: text/html\n\n"; print $template->output;
exit;
■ tmpl 側
<html> <body>
<table border="1" cellpadding="3" cellspacing="1"> <col width="100" span="2"/> <TMPL_LOOP NAME=LIST> <TMPL_IF NAME=__odd__><tr></TMPL_IF> <td<TMPL_IF NAME=__odd__><TMPL_IF NAME=__last__>colspan="2"</TMPL_IF></TMPL_IF>> <TMPL_VAR NAME=DATA></td> <TMPL_UNLESS NAME=__odd__></tr></TMPL_UNLESS> </TMPL_LOOP> </table>
</body> </html>
ループ内部で、そのデータが奇数個目かどうかの BOOL 値を持つ __odd__ 変数を使ってみた。偶数個目かどうかは unless で __odd__ を判定すればOK。他にも、最初かどうかの BOOL 値を持つ __first__ 変数、最後かどうかの BOOL 値を持つ __last__ 変数、そして最初でも最後でもない __inner__ 変数がある。使い道はいろいろ。素敵。
三段組はどうするかっていうと、まあテンプレートに渡す側でごにょごにょしてやる必要があるんだろうなあ。惜しい。
HTML::Template には、これ以外にも filter とか面白そうなオプションが色々。詳細は、ここを見てくだされ。
こういう良い感じのモジュールを集めると、perl でのアプリ開発も、かなりラクチンになるかと。PHP の Smarty も良いけど、Unix系サーバなら大概使えるっていう汎用性を考えて、 perl も選択肢として、まだまだ取っておきたいね。個人的に。