先月から今月にかけて、夜間や休みの日に、古い(それこそ10年くらい前に作ったものとか)Perl CGI のソースの修正をしてて、まあ、自分で作ったものはなんとかなるんだけど、外注さんに頼んで作ったものとか、自分のやり方とは違ってたりしてハマるわぁ(^^;
例えば、俺はテンプレートの HTML ファイルに動的な値を貼り付ける時に自前で処理を書くんだけど(まあ、正規表現で値を書き込む箇所のマーカーになる文字列見つけて置換するだけだし)、以前よく使っていた外注さんは HTML::Template モジュールを使っていた。
PHP の Smarty みたいな高機能テンプレートエンジンね。
テンプレートエンジンを使うと、ちょっとした HTML のデザイン変更の時にプログラムソースに手を入れなくても HTML テンプレートだけ直せばどうにかなるので便利なことも多いんだけど、うちの仕事だと「どっちみちプログラムも直さないといけないケース」が多いんで、結局「プログラム修正」「HTML::Template のルールに沿ったテンプレートの修正」の両方が発生しちゃうからあんまり工数の削減や修正のしやすさにつながらないんだよね。
テンプレートエンジン厨の怨嗟の声が聞こえてきそうだけど(笑)
テンプレートエンジンに限らず、こういうのを使う/使わないはケース・バイ・ケースなのよ。使った方がいいのに使わないのも愚かだけど、どんなケースでも、常に HTML::Template モジュールを使うというのも愚かなこと。
ま、そういうわけで、俺自身は「別に使わなくていいんじゃないの」というケースが多いから、今まで使ったことがほとんどなくて(まったく無いわけじゃないけど)、たまに使うと(って、ほとんど他人が作ったもののメンテナンスだけど)下らないことでハマっちゃうんよね(^^;
今日も、仕様変更にともなってテンプレート HTML の不要な部分をバサッと削ったら、いきなり Internal Server Error が出始めて、なんじゃ?とログを見たら・・・
[Sat Feb 13 18:13:42 2016] [error] [client 202.XXX.XXX.XXX] HTML::Template->new() : found </TMPL_LOOP> with no matching <TMPL_LOOP> at template.html : line 133! at HTML/Template.pm line 1558., referer: http://exsample.co.jp/cgi-bin/hogehoge.cgi[Sat Feb 13 18:13:42 2016] [error] [client 202.XXX.XXX.XXX] Premature end of script headers: hogehoge.cgi, referer: http://exsample.co.jp/cgi-bin/hogehoge.cgi
ああ・・・<TMPL_LOOP> と </TMPL_LOOP> がアンマッチだとおっしゃってる(^^;
確かに、
<!--tmpl_loop name="hogehoge_list"-->~ほげほげ~<!--/tmpl_loop-->
の、
<!--tmpl_loop name="hogehoge_list"-->
だけ消して、
<!--/tmpl_loop-->
が残ってるわぁ(^^;気づかんかった(^^;
で、素直に修正すればよかったんだけど、あんま日頃 HTML::Template モジュール使わないんで、Template クラスをインスタンス化する時、
my $template = new HTML::Template(filename => $filename,die_on_bad_params => 0,path => DEF_TMP_DIR);
みたいに die_on_bad_params オプションに 0 を与えておけば、エラーは全て無視をしてベストエフォートな実行をしてくれるのだと思い込んでて、なんかインスタンス化のオプションの組み合わせがおかしいんじゃないかとか、変なところで悩んでハマってしまった(^^;
die_on_bad_params は読んで字のごとく、「テンプレートで定義していないパラメータを処理しようとしても無視する」ってだけのことなのね(^^;
つまり、hoge というパラメータで指定された部分を置換しようとした時、実際にはテンプレート上に
<!--tmpl_var name="hoge"-->
という記述がなければエラーになるけど、それを無視するってだけのオプション・・・
さすがに、「ループの終了はあるのに、ループの開始は無い」ようなエラーまでは無視してくれんか(^^;
エラーメッセージやマニュアルの記述は、素直に言葉通りに解釈せよということですな(^^;
という反省エントリーでありました(笑)