書き直してみるシリーズ第3弾。
今回は、CGI::Prettyを使ってみた。
…と言ってもソースを見ただけでは何が違うのかわからないけど。
あと、Perl5.8っぽい書き方を目指してみた。
CGI::Prettyは、出力するHTMLソースをインデントをつけて整形して出力してくれる。
それ以外は、CGI.pmと同じで、使い方も
use CGI;
の部分を
use CGI::Pretty;
に変更するだけ。
で、Perl5.8っぽい書き方のほうだが。
(おそらくこのままだとフォームからの入力ではまりそうだけど、)とりあえずの考え方として、
use encoding "euc-jp";
を使う事とした。
こうすることで、この「euc-jp」で書かれたスクリプトが実行されるときには「Perlの内部形式」に変換されて実行されるようになる。
ただし、出力するときには「Perlの内部形式」のまま出力すると
Wide character in print at ....
のように警告されるので、Encodeを使って出力用の形式に変換してやる必要があるようだ。
とりあえず、今回はそれほど問題ではなかったが、Perl 5.8.x Unicode関連によると、
encoding プラグマはお手軽だけど副作用が大きいとのことです。Perlの方向性としては、 ソースコードをUTF8で書き、use utf8 するというのがいいらしいです。
ということなので、euc-jpで書いているのであれば、無理矢理Perl5.8っぽい書き方をする必要は無い。
ただし、「Perlの内部形式」を意識した場合、マルチバイトな文字でも1文字扱いとなるので、テキスト処理に対してますます有利になることは間違いないだろう。
ソースコード
#!/usr/bin/perl -T
use strict;
use warnings;
use Encode;
use encoding "euc-jp";
use CGI::Pretty;
use FileHandle;
{
my $cgi = CGI::Pretty->new;
my $styles = [q{../../ipp.css}, q{../test.css}];
my $wdays = ["日", "月", "火", "水", "木", "金", "土"];
my $output = "";
$output .= &print_header($cgi, "テスト3", $styles);
$output .= $cgi->p("「temp.txt」に書き出します。");
my $fh = FileHandle->new("./temp.txt", "w") or die;
my $fh_output = "";
$fh_output .= "この文は temp.txt の中身になるはずです。\n";
$fh_output .= "書き込んだ時間は、";
my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime;
$fh_output .= sprintf("%04d/%02d/%02d(%s) %02d:%02d:%02dです。\n", $year + 1900, $mon + 1, $mday, $wdays->[$wday], $hour, $min, $sec);
$fh->print(Encode::encode("utf8", $fh_output));
undef $fh;
$output .= $cgi->div({-class => "test"}, $cgi->a({-href => "./temp.txt"}, "temp.txtを見る"));
$output .= &print_footer($cgi);
print Encode::encode("utf8", $output);
}
exit;
# ヘッダ
sub print_header {
my ($cgi, $title, $styles) = @_;
my $result = "";
$result .= $cgi->header({ -charset => "utf-8" });
$result .= $cgi->start_html({
-lang => 'ja',
-title => $title,
-style => { src => $styles },
});
$result .= $cgi->div({-class => "head"},
$cgi->h1($title),
$cgi->hr,
$cgi->a({-href => "../../../" }, "Home"),
"/",
$cgi->a({-href => "../../" }, "Perl"),
"/",
$cgi->a({-href => "../" }, "TestCGI Index"),
$cgi->hr,
);
return $result;
}
# フッタ
sub print_footer {
my ($cgi) = @_;
my $fh = FileHandle->new("../../sig.txt") or die;
my $sig = join "", $fh->getlines;
undef $fh;
my $result = "";
$result .= $cgi->div({-class => "foot"},
$cgi->hr,
$cgi->a({-href => "../../../" }, "Home"),
"/",
$cgi->a({-href => "../../" }, "Perl"),
"/",
$cgi->a({-href => "../" }, "TestCGI Index"),
$cgi->hr,
$sig,
);
$result .= $cgi->end_html;
return $result;
}
