HTML::Template(2) TMPL_VAR
HTML::Template を使ってみる(1) の続きです。
前回勉強した TMPL_VAR タグをもうちょっと掘り下げます。param メソッドで設定した値と置き換わるのでしたね。NAME 属性で、どの値と置き換わるのかを指定しましたが、他にも属性を利用できます。
ESCAPE 属性を指定すると、置き換わる値がエスケープ*1された状態で出力されます。ESCAPE 属性に指定できる値は3種類あり、それぞれ異なるエスケープ処理を行なってくれます。以下にまとめました。
ESCAPE | 行なわれるエスケープ処理 |
---|---|
指定なし | そのまま出力する。 |
HTML | HTML タグの一部にする為のエスケープ処理。 例えば「"」→「"」や、「<>」→「<>」など。 |
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:特殊な記号などの意味を打ち消す為の処理