うまいぼうぶろぐ

linuxとhttpdとperlのメモ

perl - Template Toolkit 勉強

HTML::Templateみたいな。HTML用だけではなく汎用的に使える。設定次第では出力時にhtml用にescapeとかもしてくれる。

CGI::ApplicationではPlugin::TTもある。

use Tempalte;

my $tt = Template->new();
$tt->process('path.tt', { key => $value } , \my $out) or die;

print $out;

これでpath.tt内のkeyが$valueになる。

templateの書き方

  • GET

変数の取得

[% key %]      # key => $valueになる
[% key -%]     # key => $valueになる / 余分な改行を抑える
  • %はループを使うときに便利。
  • SET

変数の設定

[% foo = 'hoge' %]
[% bar = foo %]    # barに変数foo(今は'hoge')を代入
[% baz = "$bar" %] # ""で囲ってperlの変数風にも書ける

template中で、他のtemplateを読む

INCLUDEかWRAPPERを使う。WRAPPERのがシンプル。
[% content | indent(' ') %]
とすると、contentの部分にtemplateを埋め込むときに
先頭に空白を入れてインデントできる。

  • parent.tt
<body>
[% content %]
</body>
  • wrapper.tt
[% WRAPPER parent.tt %]
hogehoge
[% END %]

これで

$tt->process('wrapper.tt');

を実行する。processで指定するのはparentのほうじゃなくてwrapperのほう。

ループ

FORとかで。ハッシュを渡してたらkey, valueでアクセス出来る。

[% FOR i in hashref %]
  [% i.key %] [% i.value %]
[% END %]
  • loop オブジェクト

loop.size、loop.countとかで色々取得できる。

多重ループ

多重ループ内でloopオブジェクトを使うと、内側(深い)のループを参照するので、外側は参照できない。iteratorプラグインを使ってloop以外の名前にloopオブジェクトを設定する。↓の例はlistという名前にloopオブジェクトを設定。
配列: foolist, barlist

[% USE list = iterator(foolist) %]
[% FOR foo IN list %]
[% FOR bar IN barlist %]
  foo index: [% list.index %]
[% END %]
[% END %]