frei

旧「anney's room」からブログ「frei」だけ引っ越し&残しました

エラーをエラーに。

先日、既存スクリプト読んでたら、

ひっかかった perl のワナについてメモ。

use strict も書いてるんだけど、エラーに扱って欲しい時も実行しちゃうんだよね。

どうすりゃ完璧にエラーに出来たんだかなぁ…。

#!/usr/bin/perl -w

use strict;

use warnings;

my %hash = undef;

if ($hash{'age'} == '0') {

print "Your age is zero.\n";

} else {

print "Your age isn't zero.\n";

}

exit;

結果、これは前者「Your age is zero.」になっちゃう。

「if ($hash{'age'} == '0') {」を「if ($hash{'age'} == 0) {」にしても同じ結果。

Odd number of elements in hash assignment at ./testHash.pl line 6.

Use of uninitialized value in list assignment at ./testHash.pl line 6.

Use of uninitialized value in numeric eq (==) at ./testHash.pl line 8.

Your age is zero.

勿論、「defined $hash{'age'} and $hash{'age'} == 0」にすりゃいいんだけど

それ以前に、こういうミスは誰だってやっちゃうと思うので

そもそも実行されちゃう事、自体が問題かと思ったり。

そこで、どう実行させないようにしたらいいのか考えてみるのだけど。

かと言って、warning レベルでストップさせちゃうと…

#!/usr/bin/perl -w

use strict;

use warnings;

BEGIN {

$SIG{__WARN__} = sub { die(@_) }

}

my %hash = undef;

if ($hash{'age'} == 0) {

print "Your age is zero.\n";

} else {

print "Your age isn't zero.\n";

}

exit;

全ての warning が起きた時点で、実行中止されちゃうし。

って、そりゃ一切 warning の出ないスクリプトがいいんですけどね…。