2006年03月06日
perl で Use of uninitialized value in pattern match
[ カテゴリ : google 迎撃テスト ]久々 google 迎撃テスト。
perl で Use of uninitialized value な warning が出るのをどうにかしたい人が世に多いと見た。
加筆:
"Use of uninitialized value in pattern match" は「初期化されていない値がパターンマッチで使用されました」という警告です。他に置換や print でも出ます。(エラーメッセージ等は下のほうの例参照)
安直な回避方法としては、-w オプションをとっぱらって警告を出ないようにする。
まっとうな回避方法は、if で分岐して、未定義値じゃないときだけprintなりパターンマッチなりするようにする、です。
以下は旧コンテンツ。スクリプトの例と、どうだどエラーが出ないかの例。
加筆終わり:
で、以下のようなサンプルスクリプトを走らせてみる。
#!/usr/bin/perl -w
print $x;
print "1\n" if $x =~ /^$/;
$x =~ s/1/2/;
とかいうスクリプトを実行するとずらずら警告が出る。
Use of uninitialized value in print at ./x.pl line 2.
Use of uninitialized value in pattern match (m//) at ./x.pl line 3.
1
Use of uninitialized value in substitution (s///) at ./x.pl line 4.
ここで、3行目は警告は出るけど、パターンマッチでは該当している。
つまり、ぶっちゃけ警告されても動作は期待通りなのが普通なんだが、
cgi なんかでこの警告出ると apache のログがうるさくてしょうがない。
消し方1:
1行目の -w をなくすと warning が出なくなる。他の warning も出なくなるけど。
消し方2:
自分がスクリプト本体をそれなりに書き換えていいなら warning が出ないように厳密な分岐をする。
たとえば下記だと出ない。(下記のように if の条件式で uninitialized value を使っても怒られない)
#!/usr/bin/perl -w
if ($x) {
print $x;
print "1\n" if $x =~ /^$/;
$x =~ s/1/2/;
}
else {
print "1\n";
}
ちなみに if ( defined $x ) とかのほうが厳密で正しいですw
投稿者 JK : 15:46 | コメント (4) | トラックバック
2005年02月24日
google 検索ワードに答えてみるテスト1
[ カテゴリ : google 迎撃テスト ]ここは基本的に google から人が来るサイトなので、もっと来て欲しいなと思うなら、「どんなキーワードで来たか」から「その人はどういう情報を求めていたか」を類推して、答えを書いておくといいんじゃないかという気の長い試み。
お題:vine linux 3.1 cgi 動かない
回答:
root になって /etc/httpd/conf/httpd.conf を編集しよう!
#AddHandler cgi-script .cgi
って行があるので、# を消す。これで.cgi なファイルが
cgi-script なんだなーとわかってもらえる。
でもそれだけじゃダメで、同じ httpd.conf 内で
<Directory />
Options FollowSymLinks ExecCGI
AllowOverride All
</Directory>
とかって部分がある。
Options の行に ExecCGI がないとダメ。入れる。
#本当は、必要な場所でだけ ExecCGI されるようにすべきなんだけどね。
httpd.conf を保存終了したら、root で
# /sbin/service httpd restart
とやって、httpd 再起動。どうよ?
注意事項としては「どこでも cgi 走っちゃうのでセキュリティ注意!」ってことかな。
・・・・
これで実際は
cgi の1行目の /usr/local/bin/perl を/usr/bin/perl にすれば動く
とかだったら笑う(笑)