Template::Likeなるものを触ってみた

ぼへーっとCPANRSS眺めてたらTemplate::Likeとかいうが目に付いたのでさっそく触ってみた。

以下概要のまんまだけど例。

 use Template::Like;
 
 my $input = q{
 [% var %]
 [% FOREACH item = vars %]
 - [% item.name %]
 [% END %]
 [% var %]
 [% IF bool %]TURE!![% ELSE %]FALSE!![% END %]
 [% UNLESS bool %]TURE!![% ELSE %]FALSE!![% END %]
 };
 
 my $param = {
   var  => "HOGE",
   vars => [ { name => "FOO" }, { name => "BAR" } ],
   bool => 1
 };
 
 my $t = Template::Like->new;
 
 my $output = "";
 
 $t->process(\$input, $param, \$output);
 
 print $output;

# PODの$paramのvarsのところにtypoがあったのでちょっといじってます。

これを実行すると、

 HOGE
 -
 FOO
 -
 BAR

 HOGETURE!!FALSE!!

となった。

なんか改行される場所が変だったりして、まだまだ開発中なのかなぁという感じですね。あとINCLUDEとかもうまく動かなかった。

一応、VMethodやFiltersにも対応してて[% var.length | html %]みたいな感じで書ける模様。

とりあえずTemplateととのベンチを取ってみる。

use Template::Like;
use Template;
use CGI;
use Benchmark qw(cmpthese timethese :hireswallclock);

my $input = q{
[% var | html | html_line_break %]
[% FOREACH item = vars %]
・[% item.name.length | html %]
[% END %]
[% obj.param('hoge') %]
[% IF bool %]
    [% IF bool == 1 %]true[% END %]
[% ELSE %]
    false
[% END %]
};

my $param = {
    var  => "<Hoge>\n",
    obj  => CGI->new(\q{hoge=aaa}),
    vars => [ { name => "FOO" }, { name => "BAR" } ],
    bool => 1
};

sub tt {
	my $tt = Template->new;
	my $output = "";
	$tt->process(\$input, $param, \$output);
}

sub ttlike {
	my $ttlike = Template::Like->new;
	my $output = "";
	$ttlike->process(\$input, $param, \$output);
}

cmpthese(100, {
    'tt'     => \&tt,
    'ttlike' => \&ttlike,
});

実行結果

         Rate     tt ttlike
tt     86.5/s     --   -42%
ttlike  149/s    72%     --

ってことで速度的には劇的に早くなるわけではなかったので積極的に使うほどでもないかなぁ。

ただし、軽量Template-Toolkitと言っているだけあって依存モジュールはカナリ少ないです。

ざっとソース見たところ、File::SpecとIO::Fileくらいでしょうか。どっちも標準モジュールなのでインスコの敷居がカナリ低いですね。

ちょっとしたときに使ってみるのもアリかもしれませんが、地雷踏むのがやっぱ怖いですね。もっと色んな人が使い出したら使ってみようかしら。


追記

公式サイト