HTML::Template(2) TMPL_VAR

HTML::Template を使ってみる(1) の続きです。
前回勉強した TMPL_VAR タグをもうちょっと掘り下げます。param メソッドで設定した値と置き換わるのでしたね。NAME 属性で、どの値と置き換わるのかを指定しましたが、他にも属性を利用できます。


ESCAPE 属性を指定すると、置き換わる値がエスケープ*1された状態で出力されます。ESCAPE 属性に指定できる値は3種類あり、それぞれ異なるエスケープ処理を行なってくれます。以下にまとめました。

ESCAPE 行なわれるエスケープ処理
指定なし そのまま出力する。
HTML HTML タグの一部にする為のエスケープ処理。
例えば「"」→「&quot;」や、「<>」→「&lt;&gt;」など。
URL URL の一部にする為のエスケープ(エンコード)処理。
「 」→「%20」、「/」→「%2F」など。
JS JavaScript の文字列定数として使う為のエスケープ処理。
「改行」→「\n」、「"」→「\"」など。


例えば、テンプレートファイルに以下のように書いておき、

[]<a href="http://www.google.co.jp/search?q= NAME="KEYWORD" ESCAPE="URL">">[]
「<TMPL_VAR NAME="KEYWORD">」を Google 検索
</a>

param メソッドで「KEYWORD」に "Perl ぱるも" をセットして

$tmpl->param( KEYWORD => "Perl ぱるも" );

output メソッドを実行すると

[]<a href="">http://www.google.co.jp/search?q=Perl%20%82%CF%82%E9%82%E0">[]
「Perl ぱるも」を Google 検索
</a>

のように置き換えられます(Shift-JIS で保存した場合)。


他にも ESCAPE="JS" とすれば、JavaScript の文字列定数の中に埋め込めるので、こんなテンプレートを書いておいて

<a href="javascript:alert('<TMPL_VAR NAME="MSG" ESCAPE="JS">')">メッセージを表示</a>

「MSG」に複数行を文字列をセットして

$tmpl->param( MSG => <<MSG );
Hello, JavaScript world.
I'm Palmo!
MSG

output メソッドを実行すれば

<a href="javascript:alert('Hello, JavaScript world.\nI\'m Palmo!\n')">メッセージを表示</a>

のように、適切に改行やシングルクォートがエスケープされます。便利ですね。(^_^)


また TMPL_VAR 要素には DEFAULT 属性を指定する事ができます。DEFAULT 属性は、読んで字の如く「値が設定されてない場合のデフォルト値」を決める事ができます。

<p>こんにちは、<TMPL_VAR NAME="NAME" DEFAULT="通りすがり">さん</p>

これをテンプレートに書いておき、「NAME」を設定せずに output メソッドを呼び出すと

<p>こんにちは、通りすがりさん</p>

と出力されるわけです。もちろん、「NAME」を設定すれば、設定した値が表示されます。これも便利。


というわけで、今回試したテンプレートはこちらです。「tmplvar.tmpl」として保存しました。

<html>
<head><title>TMPL_VAR Attributes</title></head>
<body>
<h1>TMPL_VAR Attributes</h1>

<h2>ESCAPE</h2>

<p><a href="http://www.google.co.jp/search?q= NAME="KEYWORD" ESCAPE="URL">">「<TMPL_VAR NAME="KEYWORD">」を Google 検索</a></p>

<p><a href="javascript:alert('<TMPL_VAR NAME="MSG" ESCAPE="JS">')">メッセージを表示</a></p>

<h2>DEFAULT</h2>

<p>こんにちは、<TMPL_VAR NAME="NAME" DEFAULT="通りすがり">さん</p>

</body>
</html>

そして、CGI スクリプトがこちらです。外部のデザインと内部のデータの切り離しが出来ていて、スクリプトがとても読みやすいですね。以前、変数を HTML として出力するスクリプトを書きましたが、どちらが読みやすいか一目瞭然です。

#!/usr/local/bin/perl
use strict;
use HTML::Template;

my $tmpl = HTML::Template->new(filename => 'tmplvar.tmpl');

$tmpl->param( KEYWORD => "Perl ぱるも" );

$tmpl->param( MSG => <<MSG );
Hello, JavaScript world.
I'm Palmo!
MSG

print "Content-Type: text/html\n\n", $tmpl->output;

実行結果は以下から見る事ができます。
tmplvar.cgi 実行結果
コードを書かずにエスケープ処理が出来るのは面白いですね。

*1:特殊な記号などの意味を打ち消す為の処理