Template Toolkit sucks

Template Toolkitはどういうわけか*1Perlにおける標準のテンプレートエンジンの座にいるが、その仕様は美しいとは言い難い。特にまずいのは、 あるトークンの意味がコンテキストや実行状態によって異なることだ。
記号の意味がコンテキストによって異なる例:

[% SET foo = bar # "="は代入 %]
[% FOR foo = bar # "="は"IN"のエイリアス %]

リテラルの意味がコンテキストによって異なる例:

[% GET     foo #  foo という変数を参照 %]
[% INCLUDE foo # "foo"というファイルを参照 %]

フィールドの参照が実行状態によって異なる例*2

#!perl -w
use strict;
use Template;
my $tt = Template->new();

# "keys"があるときはフィールドの参照
$tt->process(\<<'T', {data=>{keys=>42}});
[% data.keys   # 42 %]
[% data.keys() # 42 %]
T
# "keys"がないときはメソッドの呼び出し
$tt->process(\<<'T', {data=>{foo=>42}});
[% data.keys.join("")   # foo %]
[% data.keys().join("") # foo %]
T

また、リテラルに対してメソッドを呼び出せないというよくわからない制限もある。

[% "foo".length() # => parse error %]

参考文献: http://d.hatena.ne.jp/tokuhirom/20100607/1275871288

*1:たしかに、多機能でドキュメントも豊富である。しかしよく知られるようになったのは名前の影響もあるのではないか。TTが「Template」という汎用な名前にしたおかげで、その他のテンプレートエンジンは命名に苦労することになった。

*2:これは流石にバグではないかと思うが