Perl の HTML テンプレート
- 思ったより情報が少ない
- CPAN にはたくさん登録されているが、FreeBSD の ports, Debian package で探すと以下の3つしかない。1perldoc.jp にも以下の2つしかない。
- HTML::Template
- CGI::FastTemplate
- Template(template-toolkit.org)
HTML::Template
- 独自タグ <TMPL_VAR> を使う
- HTML タグの中に HTML タグを書くことになるのだが、エディタで見ている場合はともかく、WYSIWYG ツールには優しくない気がする。
- 特に顕著なのは属性の値をこれで与える場合。NAME="VAR" の "" は書かなくてよいので、そういうルールで運用しておいた方が無難。2
- 内容をセットしない変数の部分は出力されない。この動作はいい。
- このモジュールで output() しても実際には STDOUT には出力されない。結果が返ってくるのでそれを print する。なんか意外な動作。
- テンプレートの中にロジック入りまくり。
<TMPL_LOOP>
<TMPL_INCLUDE>
<TMPL_IF>
こういうテンプレートの方が人気が出るが、これはテンプレートの役割として謳われているロジックとデザインの分離が果たされていないということをみんなあえて無視しているんだろうか? つーか文法が2つもあったら邪魔くさいじゃん。文法は Perl だけにしようよ。
キャッシュはあるが、HTML::Template::JIT を使うとさらに高速化できる。ただし、コンパイルは遅い。
CGI::FastTemplate
Fink には入ってなかった。
- 変数は Perl の文法に従い $VAR と書く
- 正確には以下の正規表現にマッチするものに限る。(UPPERCASE に限るってちゃんと perldoc に書いてほしいなぁ。)
/\$(?:([A-Z][A-Z0-9_]+)|\{([A-Z][A-Z0-9_]+)\})/
- 内容がセットされなかった変数の部分はそのまま $VAR と表示される
- HTML である必要はない
- 正規表現でパースしている
- man では eval を使っていないから速いという話
- 単純な正規表現パースなのでテンプレートにロジックを入れられない(Good!)
- CGI 用に content-type ヘッダを自動で出力はしてくれない
- strict() メソッドで parse エラーを STDERR に吐き出すことができるので、Web サーバのログを利用しながらテンプレートのデバッグができる
- if や loop などのインテリジェントな機能はない(テンプレートにロジックが書けないだけじゃなくて、そもそも機能としてない)
- loop は苦肉の策で loop 部分だけ別のテンプレートに分割してそのテンプレートの parse 結果をスクリプト内で loop して連結させるという方法を採る。loop の数が1つだけならいいかもしれないが、list 1つ、table 2つとか言うテンプレートになるともう扱いがかなり面倒な気がする
本格的な運用には難しいような
template-toolkit.org
かなり柔軟な処理ができるらしい。
CGI には限らず使えて、変数は [% var %] で書く。INTERPOLATE オプションをつければ $var と書ける。(FastTemplate と違って小文字で ok)
- 変数名はブロックの単位でハッシュ変数を割り当てるとかなり分かりやすいものにできる。
- ハッシュのハッシュでも ok
- [% %] の記述であれば、という制限がつくと思う(まだよく分かっていない)が、テンプレート内に制御構造をバリバリ書ける。
- 考え方によっては [% %] でループなどのブロックを、$ で変数を書ければよかったんじゃないかなぁと思うんだけど、どうもそうはなっていないらしい。
- 個人的には独自タグ方式よりまだマシに見えるけど、まだテストが必要ですな。