=~ の構文を勘違いしてた
ラクダ本 p.167 によると、Perl の「=~」演算子は左側にスカラー式を、右側に指定された3つのクォート風の演算子 m//、s///、tr/// のどれかと結びつける。
だから、
my $string = "hoge"; print "match!\n" if m/hoge/ =~ $string;
は間違いで、以下が正しい。
my $string = "hoge"; print "match!\n" if $string =~ m/hoge/;
こんなことで30分ぐらいはまった俺って…。そもそも、CGI の場合に、warning がどこに吐かれているか知らないのが問題だな。普通の Perl プログラムだったら、use warnings しとけば「Use of uninitialized value in pattern match (m//) at hoge.pl line 9.」などと教えてくれるんだけど。後で分かったら追記することにしよう。