【perlメモ】ヒアドキュメントの中に直接コードを書く方法
最近perlでプログラムを書くときにText::MicroTemplateを使っているとテンプレートの中に直接コードが書けて便利だなーと思ってたら、ヒアドキュメントの中にも直接コードを書く事ができる方法があることを先日知った。今まで出来ないと思い込んでいてずいぶん無駄な処理をしていた。
Text::MicroTemplateを使った場合だと下のように書ける。
sample02.pl
#!/usr/bin/perl
use strict;
use warnings;
use utf8;
use Text::MicroTemplate qw(:all);
my $mode = 2;
my $renderer = build_mt(<<"EOF");
<html>
<head>
<title>sample</title>
</head>
<body>
<?= ‘Time = ‘.time . ‘ Localtime = ‘ . scalar localtime ?>
?= ‘Random Number 0 to 9 = ‘.int(rand(10))
<hr>
<input type="checkbox" name="option" value="1" <?= ($mode == 1) ? ‘checked’ : ” ?>>
<input type="checkbox" name="option" value="1" <?= ($mode == 2) ? ‘checked’ : ” ?>>
<input type="checkbox" name="option" value="1" <?= ($mode == 3) ? ‘checked’ : ” ?>>
</body>
</html>
EOF
my $html = $renderer->()->as_string;
print "Content-Type: text/html; charset=utf-8\n\n$html";
sample02.plの実行結果
>perl sample02.pl
Content-Type: text/html; charset=utf-8
<html>
<head>
<title>sample</title>
</head>
<body>
Time = 1292851505 Localtime = Mon Dec 20 22:25:05 2010
Random Number 0 to 9 = 6
<hr>
<input type="checkbox" name="option" value="1" >
<input type="checkbox" name="option" value="1" checked>
<input type="checkbox" name="option" value="1" >
</body>
</html>
>
perl標準の機能で同じようなことを出来ることが判明。ヒアドキュメントの中に下のようにしてコードを埋め込むことが出来る。
@{[ perlコード ]}
sample01.pl
#!/usr/bin/perl
#
#print <<"EOF";
#
# @{[ perlコード ]}
#
#EOF
#
use strict;
use warnings;
my $mode = 2;
print "Content-Type: text/html; charset=utf-8\n\n";
print <<"EOF";
<html>
<head>
<title>sample</title>
</head>
<body>
@{[ ‘Time = ‘.time . ‘ Localtime = ‘ . scalar localtime ]}
@{[ ‘Random Number 0 to 9 = ‘.int(rand(10)) ]}
<hr>
<input type="checkbox" name="option" value="1" @{[ ($mode == 1) ? ‘checked’ : ” ]}>
<input type="checkbox" name="option" value="1" @{[ ($mode == 2) ? ‘checked’ : ” ]}>
<input type="checkbox" name="option" value="1" @{[ ($mode == 3) ? ‘checked’ : ” ]}>
</body>
</html>
EOF
sample01.plの実行結果
>perl sample01.pl
Content-Type: text/html; charset=utf-8
<html>
<head>
<title>sample</title>
</head>
<body>
Time = 1292852079 Localtime = Mon Dec 20 22:34:39 2010
Random Number 0 to 9 = 7
<hr>
<input type="checkbox" name="option" value="1" >
<input type="checkbox" name="option" value="1" checked>
<input type="checkbox" name="option" value="1" >
</body>
</html>
>
これは便利。色々活用できそうです。ちょっとしたことならテンプレート使わなくてもよくなります。
しかし、Text::MicroTemplateの様にループ文などを簡単に書くことは出来ないようなので複雑なことは出来なそうです。そういう場合はやっぱりテンプレートモジュールを使ったほうが良さそうですけど、テンプレートの中にループ文などの複雑なコードを書き込まないというポリシーの人にはテンプレート使うより処理が軽くなってよさそうです。サブルーチンは普通に呼べるので複雑なことはサブルーチンでやればいいと思います。