イディオムの落とし穴

ウェブや書籍、雑誌で読んだ事でも、実際に失敗した経験がないと失敗してしまうという事がよくあります。

WEB+DB PRESS Vol.43

WEB+DB PRESS Vol.43

WEB+DB PRESS 最新号でnaoyaさんがPerl 5.10の紹介のところで触れていた話で、読んでいたにも関わらず、以下のようなミスを犯しました。

my $input = 0;
my $flag = $input || 1;

$flagは「1」になります。これはまあ、こうやってみてみれば明らかなんですが、Perlにおいて「0」はfalseと評価されるからですね。このイディオムの落とし穴は有名なもののようで、だんだん書いててさらに恥ずかしくなってきましたが。

やり方はいろいろあるかと思うのですが、とりあえずこんな感じで対処しました。

my $input = 0;
my $flag = defined $input ? $input : 1;


ちなみに記事の内容自体は5.10から新しく追加される//(Defined-or)演算子の話で、「未定義値だったら初期値として25を入れる」というケースで

use feature qw/ say /;
my $zero = 0;
$zero ||= 25;
say $zero;

とやると「$zeroは25になっちゃうよね」という話で、今までなら

$zero = 25 if not defined $zero;

などと書く必要があったけど、5.10からは

use feature qw/ say /;
my $zero = 0;
$zero //= 25;
say $zero;

という風にすればこの問題は回避できるという話題でした。