2007年9月3日月曜日

PerlのWARNINGをなくす

perl -w hoge.pm

Perl開発者が死ぬまでに一番たたくコマンドじゃなかろうか('A`)
これでエラーを見つけて修正して、やっとこさ動くプログラムが完成する。しかし正常動作してもこのコマンドを叩くと警告とかが出てくる。

■警告内容
・その1.Use of uninitialized value in hash element at hoge.pm line 123
・その2.Use of uninitialized value in substitution (s///) at hoge.pm line 456

エラーじゃないしプログラムもちゃんと動くので今まで無視してきたけど、ちょっと気になってきたので直してみる。

■その1の警告の解決方法
その1の場合は「変数としては存在するけど、それに値が入ってるのか入ってないのか解らない。だから値を確認するか空の値を入れておけ」という旨なので、以下の赤い部分の様なモノを追加してあげる。そうすると値がNullでも確実値が入っているか入ってないかが解るので、警告文が消える。
意外と忘れがちなのが「$key」の部分。値がNullであればわざわざ入れる必要ないのだから、if文でチェックしてnextしておく。
$HOGE={};
foreach my ($key,$value)=split(/\=/,$line,2){
next if( !$key );
$HOGE->{$key}=$value || '';
}


■その2の警告の解決方法
ぱっと見で解る人がいると思うけどこれは正規表現関係。Perlで正規表現って結構強力で頼れるんですよね・・・。
問題となるのは正規表現を何個か連発した時。
エラーの内容としては
「正規表現って値をごちゃごちゃいじるけどいじった結果って解らないよね?値が消えちゃってる可能性ない?ひょっとしたら今行った正規表現で、値が空になってね?」
と言う警告。なのでコード上は余り綺麗じゃないが下記の様に修正。値が入っている事を確認してから処理。値が入ってなければ処理する必要もないんで問題なし。
$value=~s/ABC/xxx/g if( $value );
$value=~s/EFG/yyy/g if( $value );
$value=~s/DEF/zzz/g if( $value );

これで正規表現中の警告が消える。

警告なので直す直さないは個人の自由だけど、errorログが綺麗になるんで、暇とか余裕があったからやってみた
コメントを投稿