Perl HTML::Template 系テンプレートエンジンの使用方法。
HTML::Template::Pro を使用するのがベスト。
    [root]# cpan HTML::Template
    [root]# cpan HTML::Template::Expr
    [root]# cpan HTML::Template::Pro
    テンプレートを表示するには、HTTP ヘッダが必要。
    use CGI;
    my $cgi_obj = CGI->new();
    print $cgi_obj->header( -type =>'text/html', -charset =>'utf-8' );
    use HTML::Template;
    my $tmpl_obj = HTML::Template->new(
                          filename => 'テンプレートファイル名',
                          # オプション
                          default_escape => 'HTML',  # " < > &を " < > & に変換
                          cache => 1,  # mod_perl 使用時、テンプレートをキャッシュ
                          associate => $session,  # 他のオブジェクトからパラメータを継承
                      );
・TMPL_VAR
    <!-- tmpl_var escape=html escape=url default=value name=PARAMETER_NAME -->
    $tmpl_obj->param( PARAMETER_NAME => '値' );
    テンプレート出力時に、値 の文字列に置き換えられる。
    オプション
    escape=html   " < > &を " < &g;, & に変換
    escape=url   URL エスケープ
    default=value   デフォルト値を設定
・TMPL_LOOP
    <table>
    <tr><th>氏名</th><th>NO</th></tr>
    <!-- tmpl_loop name=LOOP_NAME -->
    <tr><td><!-- tmpl_var name=name --></td><td><!-- tmpl_var name=no --></td></tr>
    <!-- /tmpl_loop -->
    </table>
    my @loop_data = (
                     { name => matsui, no => 55 },
                     { name => ichiro, no => 51 },
                     { name => otani,  no => 11 },
                    );
    $tmpl_obj->param( LOOP_NAME => \@loop_data );  # 配列リファレンスを渡す
    TMPL_LOOP 内の TMPL_LOOP は問題なく機能する。
・TMPL_IF, TMPL_ELSE
    <!-- tmpl_if name=PARAMETER_NAME -->
          真の時の処理
    <!-- tmpl_else -->
          偽の時の処理
    <!-- /tmpl_if -->
    $tmpl_obj->param( PARAMETER_NAME => 1 );
    TMPL_IF と TMPL_LOOP で同じ名前を使用した場合、
   ループデータが存在すれば、TMPL_IF ブロックは表示される。
    <!-- tmpl_if name=LOOP_NAME -->
        ループデータが存在する時、表示される
    <!-- /tmpl_if -->
    <!-- tmpl_loop name=LOOP_NAME -->
            .
            . 
    <!-- /tmpl_loop -->
・TMPL_UNLESS, TEMP_ELSE
    <!-- tmpl_unless name=PARAMETER_NAME -->
          偽の時の処理
    <!-- tmpl_else -->
          真の時の処理
    <!-- /tmpl_unless -->
    $tmpl_obj->param( PARAMETER_NAME => 0 );
    TMPL_UNLESS と TMPL_LOOP で同じ名前を使用した場合、
   ループデータが存在しなければ、TMPL_UNLESS ブロックは表示される。
    <!-- tmpl_unless name=LOOP_NAME -->
        ループデータが存在しない時、表示される
    <!-- /tmpl_unless -->
    <!-- tmpl_loop name=LOOP_NAME -->
            .
            .
    <!-- /tmpl_loop -->
・出力
print を記述しないと、プログラム内の HTTP ヘッダが出力されない。
malformed header from script. Bad header=<!DOCTYPE html>:
    print $tmpl_obj->output();
    exit;
HTML::Template に関数の機能を追加したもの。
・利用可能な関数| 数の比較 | <, >, ==, !=, <=, >=, <=> | 
| 文字列の比較 | gt, lt, eq, ne, ge, le, cmp | 
| 算術演算子 | +, -, *, /, % | 
| 論理演算子 | &&, || | 
| 関数 | sprintf, substr, lc, lcfirst, uc, ucfirst, length, defined, abs, atan2, cos, exp, hex, int, log, oct, rand, sin, sqrt, srand | 
    use HTML::Template::Expr;
    my $tmpl_obj = HTML::Template::Expr->new(
                          filename => 'テンプレートファイル名',
                          default_escape => 'HTML',
                          # オプションは HTML::Template と同様
                         );
    <!-- tmpl_if expr="defined(id)" -->
        <!-- tmpl_var name="id" -->
    <!-- tmpl_else -->
        undefined
    <!-- /tmpl_if -->
    $tmpl_obj->param( id => '値' );
 
    <!-- tmpl_if expr="weather eq '晴れ'" -->
        晴れ
    <!-- /tmpl_if -->
    <!-- tmpl_if expr="weather eq '曇り'" -->
        曇り
    <!-- /tmpl_if -->
    <!-- tmpl_if expr="weather eq '雨'" -->
        雨
    <!-- /tmpl_if -->
    $tmpl_obj->param( weather => '値' );
HTML::Template(::Expr)と互換性を持つように C/Perl+XS で記述されたもの。
use HTML::Template を use HTML::Template::Pro に変えるだけで、5倍高速になる。
    use HTML::Template::Pro;
    my $tmpl_obj = HTML::Template->new(
                          filename => 'テンプレートファイル名',
                          default_escape => 'HTML',
                          # オプションは HTML::Template と同様
                         );