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 にすれば動く
とかだったら笑う(笑)

投稿者 JK : 20:23 | トラックバック