Text::MicroTemplate 版 String::TT をどう作るか
とりあえず、現状は
my $user = 'John';
my $html = eval as_html('Hello, <?= $user ?>')
or die $@;という方式だけど、エラー処理をユーザーが書かなきゃいけない (しかも上のコードだと警告が見えない) のが問題*1。
じゃあ String::TT みたく PadWalker を使うのか、というと、生の Perl expression を埋め込む Text::MicroTemplate では、いろいろ難しそう。書くとしたら、
sub as_html2 {
my $template = shift;
my $h = peek_my(1);
local $@;
my $html = eval(
join ';', (
(map { "my \$_ = \$h->{$_}" } keys %$h),
Text::MicroTemplate->new(template => $template)->code() . '->()'
);
die $@ if $@;
$html;
}みたいな感じなんだろうけど、変数のコピーが発生して副作用の影響が変わるし、やりすぎかなぁと思った。たとえば、オンメモリでカウンタ作るとして、
my $html = as_html2('you are <?= $cnt++ ?>th visitor');みたいなコードは意図に反する動きだ、ということになるだろう。
となると、もう普通に、stash を渡す方式にして、
my $html = as_html3('Hello, <?= $args->{user} ?>', { user => 'John'});が無難なのかなぁ。