Perlで作るミニテンプレートエンジン
Perlでちょっとしたスクリプトを作るときに、ちょっとしたテンプレートエンジンが作れれば と思っていたところ、気になるブログ記事を発見。
Perlで10行テンプレートエンジン - kawamuray's blog
この記事では正規表現を用いてたった10行でミニテンプレートエンジンを作成していたので紹介する。
実際のコード
実際のコードは以下の通り。min_tt
関数がテンプレートエンジンの役割を果たしている。
(元記事とは少しコードを変えた)
sub min_tt {
my ( $tmpl, $data ) = @_;
my $_tt = do {
$tmpl =~ s{<%(=)?(.*?)%>\n?|((?:(?!<%).)+)}{
$2 ? $1 ? "\$TT_TOKEN .= qq{\@{[do{ $2 }]}};" : $2
: "chop( \$TT_TOKEN .= <<TT_TOKEN );\n".quotemeta($3)."\nTT_TOKEN\n";
}gse;
eval "sub { my \$TT_TOKEN = ''; $tmpl \$TT_TOKEN }"
or die "ERROR: Cannot compile template: $@";
};
return $_tt->($data);
}
my $text = <<'EOS';
static const key_value_t <%= $_[0]->{name} %>[] = {
<% for my $d (@{ $_[0]->{elems} }) { %>
{ <%= $d->{key} %>, <%= $d->{value} %> },
<% } %>
};
EOS
my $data = +{
name => 'hogehoge',
elems =>
[ { key => 'hoge', value => 'fuga' }, { key => 'foo', value => 'bar' }, ],
};
my $result = min_tt( $text, $data );
print($result);