« WAN/LAN | メイン | iptables のログを分けるぞ »
2005年02月17日
コメントスパム対策とそのエラーラッシュ対策
[ カテゴリ : memo - MovableType ]
こちらのコメントスパム対策(その3)を使用させて頂いている。
非常に重宝しているのだが、my $sc_tx = param('text'); という記述があって、param('text') が uninitialized のとき(つまり、コメント投稿する内容がないとき、「さぁこれからコメントするか」ってときを含む)、httpd のログにエラーが下記のようにずらずらと並ぶ。
Use of uninitialized value in pattern match (m//) at (中略)/Jcode.pm line XXX.
Use of uninitialized value in pattern match (m//) at (中略)/Jcode.pm line XXX.
Use of uninitialized value in substitution (s///) at (中略)/Jcode.pm line XXX.
Use of uninitialized value in pattern match (m//) at (中略)/mt-comments.cgi line XX.
Use of uninitialized value in string ne at (中略)/mt-comments.cgi line XX.
これではエラーログが見づらくて嬉しくないので、ちょっと改造している。
具体的には、
1:Jcode::convert の行の1行前に
if ( $sc_tx ) {
と入れる。
2: die の次の行に } を入れる。
まぁ、要するに $sc_tx が空や未定義や未初期化の場合は convert とかすんなって仕様。
ちょっとだけ速いはずだ。
・・・でも、なんでこれでいいんだろう。わかんないけど、我が家ではこれでうまくいってる。
代入文 my $sc_tx = param('text'); をやっても uninitialized って出るってすげー気にいらない仕様ではあるよね。謎だらけ。
投稿者 JK : 2005年02月17日 21:58
コメント
undef をコピーしても undef であって空文字列ではない、というコトでせう。
投稿者 tomop : 2005年02月24日 03:26
いや、perl 4 の頃は、 undef が uninit 扱いってことはなかったと記憶してんだが・・・・
昔みたいに undef($i) とかじゃ init したことにしてもらえんのかなーと。
投稿者 JK : 2005年02月24日 05:14
あー、もしかして、 use strict だからでしょうか・・・
投稿者 JK : 2005年02月24日 15:32