HTML::Template を使ってみる(1)

昨日の「配列やハッシュを HTML で出力する」に対して id:fbis さんよりコメントを頂きました。以下、引用です。

HTMLを出力するのであればHTML::TemplateなりTemplate-Toolkitなりのテンプレートエンジンを利用した方が良いかと。まずはシンプルなHTML::Templateとかどうですか。

なるほど。テンプレートエンジンとは、HTML 部分を別のファイルとして切り分ける為のモジュールの事ですね。(^_^)
一般に、HTML のようなデザイン部分と、内部のプログラム(ロジック部分)が混在しているのは、好ましくないものとされています。1つのファイルに「Perl」と「HTML」という2つの言語が混在しているわけですから、後から読みづらくなる(可読性が落ちる)のは当然です。
また、大規模なアプリケーションを作る場合、内側のプログラムを作る人と、外側のデザインを作る人が異なっている事も多いので、デザイナさんがプログラムの中身について知らなくても、デザインできるように、という需要もあるようです。
fbis さんにご紹介いただいた HTML::Template や、Template Toolkit などのテンプレートエンジンを使えば、デザイン部分を他のファイルへと自然に切り離す事が自然にできるようになります。


というわけで、HTML::Template を使ってみます。HTML::Template モジュールは標準では付属していないので、インストールする必要があります。CPAN モジュールのインストールについては、以前勉強しましたWindows では ppm コマンドを使えば簡単ですね。コマンドプロンプトを開いて、

ppm install HTML-Template

を実行し、少し待てばインストール完了です。「perl -MCPAN -e 'install HTML::Template'」でも CPAN からダウンロードして自動的にインストールできますね。
インストールできたかどうか「perldoc HTML::Template」を実行してみました。

D:\home\palmo>perldoc HTML::Template
NAME
    HTML::Template - Perl module to use HTML Templates from CGI scripts

インストール成功です。(^_^)


早速 HTML::Template を使ってスクリプトを書き始めたい所ですが、その前に「テンプレート」となるファイルを作ります。このテンプレートが「デザイン部分」になるわけです。
テンプレートは HTML で記述するわけですが、この中では“TMPL_”から始まる名前の特別な要素(タグ)を使う事ができます。便宜上「テンプレートタグ」とでも呼びましょうか。(^_^)
以下を「hello.tmpl」として作成しました。

<html>
<head><title>HTML::Template Test</title></head>
<body>
<h1>HTML::Template Test</h1>
<p>Hello, I am <TMPL_VAR NAME="NAME"> the <TMPL_VAR NAME="LANG"> student!</p>
</body>
</html>

HTML には存在しない要素「TMPL_VAR」が使われていますね。これが「テンプレートタグ」の1種です。
「TMPL_VAR」要素は、HTML::Template によってプログラム側で指定した値と自動的に置き換えられます。NAME 属性が、置き換えられる値の名前を表しています。
これだけではちょっとわかりづらいので、このテンプレートを使って実際にプログラムを組んでみました。

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

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

$tmpl->param(
  NAME => "Palmo",
  LANG => "Perl",
);

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

HTML::Template を use して、new メソッド(コンストラクタ)を呼び出しています。その際、パラメータとして filename => 'hello.tmpl' と、読み込むテンプレートファイルの名前を渡しています。
そして重要なのが param メソッド。テンプレートの中で使われる「値」を設定しています。ハッシュのように書いていますが、これは「NAME」に "Palmo" という文字列を、「LANG」に "Perl" という文字列をそれぞれ設定しています。
先ほど書いたテンプレートの中で

<p>Hello, I am <TMPL_VAR NAME="NAME"> the <TMPL_VAR NAME="LANG"> student!</p>

と TMPL_VAR 要素を使っていましたが、このプログラムの場合 <TMPL_VAR NAME="NAME"> というタグは "Palmo" に、<TMPL_VAR NAME="LANG"> というタグは "Perl" にそれぞれ置き換えられるので、実際にはこのように表示されます。

<p>Hello, I am Palmo the Perl student!</p>

output メソッドを呼び出すと、上のような置換が行なわれ、テンプレートが処理された内容が返ってきます。最後に、お馴染みの「Content-Type」ヘッダーと、この output メソッドによって出力されたページを表示しています。
実行結果は以下の通りです。
htmpl.cgi 実行結果


テンプレートの中で使えるテンプレートタグにはまだまだ種類があるので、次回勉強してみたいと思います♪
便利なモジュールの紹介、ありがとうございました! > fbis さん