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

解説