HTML::Templateのバグ?仕様?
HTML::Template
を使っていて気になったこと。
#!/usr/bin/perl use strict; use warnings; use HTML::Template; use Readonly; my $template = q(<TMPL_LOOP NAME=LOOP> VALUE => <TMPL_VAR NAME=VALUE></TMPL_LOOP>); Readonly::Array my @list => (0 .. 10); my @loop = (); my $line = 0; foreach (@list) { push @loop, {VALUE => $_}; $line++; if ($line == 10) { my $tmpl = HTML::Template->new(scalarref => \$template); $tmpl->param(LOOP => \@loop); print $tmpl->output; } }
上のコードを実際に走らせて見ると分かりますが、エラーが出て止まります。原因になるのは$tmpl->output
のメソッド呼び出し。@list
はReadonly
モジュールで作った読み取り専用の配列でなくても構いません。上のコードは例示のためのサンプルコードなので、私が実際に書いたコードでは、Tie::File
でファイルを読み取り専用の配列のように扱うものでした。
foreach (@list) { push @loop, {VALUE => $_}; $line++; } my $tmpl = HTML::Template->new(scalarref => \$template); $tmpl->param(LOOP => \@loop); print $tmpl->output;
このようにすると正常に動作します。私はどうしても最初の例のように実装する必要があったので、しょうがなく読み取り専用属性を外しました。
これってHTML::Template
のバグなのか仕様なのか、ドキュメントを詳しく読んでいないのではっきりいえませんが、どうもバグ臭いような。誰かもっと詳しい人いませんかねぇ…