« 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