Text::MicroTemplate が良すぎて困る #
いや、困らないんだけど
- 奥さんのブログ でも書かれているが XSS 対策から自由に慣れる感じ
- 軽い。TT に比べると200% 速い感じ
- TT に比べると、覚えるコストが圧倒的に低い。ループとか全部、Perl 構文で書いてまえば OK。TT の構文は変態な感じ
- PurePerl だし依存がないので、いろんなところで使いやすい感じ
どれくらい幸せかというと
試験コード
#!/usr/bin/perl
use strict;
use warnings;
use utf8;
use Text::MicroTemplate qw(render_mt);
sub say { print @_,"\
"; }
my $str = '<hogehoge>';
my $enc = render_mt('<?= $_[0] ?>', $str); # これだけ覚えておけばなんとかなるよ!
say $enc->as_string; # こうやれば文字がかえってくる
say $enc; # render_mt はこんな感じ
say $$enc; # ちょっとお行儀悪く
say "------";
# なんでこれが嬉しいかというと
say render_mt('<?= $_[0] ?>', $enc)->as_string; # こういうことができるから
say render_mt('<?=r $_[0] ?>', $enc->as_string)->as_string; # これでもいいけど、r 付け忘れたら。。。
say render_mt('<?= $_[0] ?>', $enc->as_string)->as_string; # こんなことになってまう
say "------";
実行結果
<hogehoge>
Text::MicroTemplate::EncodedString=SCALAR(0x829484)
<hogehoge>
------
<hogehoge>
<hogehoge>
&lt;hogehoge&gt;
------
詳細は pod 読むとして、いろんな書き方ができるわな
my $tmpl = '<?= $_[0] ?>';
my $str = '<hogehoge>';
my $mt = Text::MicroTemplate->new();
$mt->{template} = $tmpl;
say $mt->build_mt->($str)->as_string;
say "-----";
my $enc = Text::MicroTemplate::render_mt($tmpl,$str);
say $enc->as_string;
say "-----";
実行結果
<hogehoge>
-----
<hogehoge>
-----
つうわけで
- 何はともあれ render_mt
- デフォルトがエスケープされるのは正義。二重エスケープには気づきやすい。エスケープ忘れは気づきづらい
- Text::MicroTemplate::File もあるよ
- render_mt ! render_mt !!
手元の TT 使ってるものを徐々に置き換えていって、気づいたことがあったらまたなんか書く