モダンPerlの世界へようこそ

第40回 Text::MicroTemplate:得意分野なんだからPerlを使えばいいじゃない,という方に

この記事を読むのに必要な時間:およそ 5 分

HTML::Mason

この系統の第二陣に属するものとしては,1997年にリリースされたHTML::Embperlや1998年リリースのHTML::Masonなどがあげられます。

これらはPHPやASPの黎明期※1に開発が進められたという時代背景も手伝って,単なるテンプレートエンジンというより,ウェブアプリケーションフレームワークとしての要素が濃くなっていますが(両者ともmod_perl環境下で使うことが大前提となっています)⁠その気になれば単独でテンプレートエンジンとして使うこともできます。

※1

ちなみにPHP 3.0の登場が1998年,4.0の登場が2000年,ASPの方はバージョン1.0が1996年,2.0が1997年,3.0が2000年のことでした。

ここではAmazon.com※2や,CPANのバグトラッカーとして有名なRTなどでの採用実績があるHTML::Masonの例のみ紹介します。

※2

HTML::Masonの公式サイトによると,Amazon.comでは2002年の中頃から同社公式サイトのテンプレートシステムとしてHTML::Masonを採用していたそうです。

HTML::Masonではテンプレートはファイルに保存することが前提となっているため,まずはカレントディレクトリにtemplate.tmplというテンプレートを用意します。初期化や引数の受け渡しなどはふつう専用のブロックを利用して行います。

<%args>
  $author
  @items
</%args>
This report is created by <% $author %>.
% for (@items) {
item <% $_ %>
% }

続いて,呼び出し側のコードを用意します。HTML::Masonを単体で使う場合は,mod_perlハンドラなどが内部的に利用しているHTML::Mason::Interpというモジュールを使うのが定石ですが,必要に応じてさらに内側にあるHTML::Mason::Compilerを利用してもよいでしょう。

use strict;
use warnings;
use HTML::Mason;
use File::Spec;

my $interp = HTML::Mason::Interp->new(
  comp_root  => File::Spec->rel2abs('.'),
  out_method => \my $out,

  # 自動でHTMLエスケープしたい場合は下記も
  # default_escape_flags => ['h'], 
);

$interp->exec('/template.tmpl',
  author => 'me',
  items  => [1, 2, 3],
);
print $out;

HTML::Masonにはほかにもさまざまな機能が用意されています。詳しくはHTML::Masonのサイトにドキュメントがまとまっているほか,O'Reilly社から刊行されたEmbedding Perl in HTML with Masonという本の全文がオンラインでも公開されています※3)⁠

※3

この原稿を書いている時点ではサーバに問題があるようで503エラーが返ってきますが,検索すれば過去のアーカイブなどをたどることはできます。

なお,HTML::Masonではインストールの敷居が高いという人は,Text::MicroMasonという選択肢もあります。こちらはMason形式のテンプレートだけでなく,設定に応じてEmbperlやText::Template,あるいはApache::ASP風のテンプレートも利用できるので,そのまま使う場合はもとより,MasonやEmbperlで書かれた古いアプリケーションをPlackなどの環境に移行する場合にも便利かもしれません。

use strict;
use warnings;
use Text::MicroMason;

my $template =<<'END';
This report is created by <% $author %>.
% for (@items) {
item <% $_ %>
% }
<%args>
  $author
  @items
</%args>
END

my $mason = Text::MicroMason->new(
  -Filters,
  default_filters => 'h',
);

print $mason->execute(text=>$template,
  author => 'me <ishigaki@cpan.org>',
  items  => [1, 2, 3],
);

また,PSGI/Plackの登場によってmod_perlと密接に結びついている必要性が薄まったこともあって,2011年2月にはmod_perlとの連携部分を外してMoose化された新しいバージョンがMasonという名前でリリースされました。こちらはまだ評価の対象とするには新しすぎますが,興味のある方は追いかけてみてください。

著者プロフィール

石垣憲一(いしがきけんいち)

あるときは翻訳家。あるときはPerlプログラマ。先日『カクテルホントのうんちく話』(柴田書店)を上梓。最新刊は『ガリア戦記』(平凡社ライブラリー)。

URLhttp://d.hatena.ne.jp/charsbar/