Text::MicroTemplate が良すぎて困る

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 "------";

実行結果

 &lt;hogehoge&gt;
 Text::MicroTemplate::EncodedString=SCALAR(0x829484)
 &lt;hogehoge&gt;
 ------
 &lt;hogehoge&gt;
 &lt;hogehoge&gt;
 &amp;lt;hogehoge&amp;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 "-----";

実行結果

 &lt;hogehoge&gt;
 -----
 &lt;hogehoge&gt;
 -----

つうわけで

  • 何はともあれ render_mt
  • デフォルトがエスケープされるのは正義。二重エスケープには気づきやすい。エスケープ忘れは気づきづらい
  • Text::MicroTemplate::File もあるよ
  • render_mt ! render_mt !!

手元の TT 使ってるものを徐々に置き換えていって、気づいたことがあったらまたなんか書く

See Also

Copyright © 髭。/ Hugo + hugo-book