2012年5月10日木曜日

Perlにはtrue/falseがない

Perlで既存コードを修正していて最近はまってしまいました。
if ($rHash->{"hoge"}) {
 if ($rHash->{"hoge"} == 0) {
  #処理
 } elsif ($rHash->{"hoge"} == 1) {
  #処理
 } elsif ($rHash->{"hoge"} == 2) {
  #処理
 }
}


$rHash->{"hoge"} にはちゃんと値が入っているのに0の時だけ処理が抜けてるのはなんでだろうと思っていたのですがPerlでは

・文字が入ってる、または、入ってない
・数字(文字)が0、または、0じゃない

で判断されてるみたいです。

ついでに調べてみるとtrueとfalseもないんですね。
http://d.hatena.ne.jp/perlcodesample/20080323/1206280262
http://www.perlplus.jp/perl/num/index5.html

既存コードは0の時も不思議なことにたまたま上手く動いてたみたいです。
definedつけて直しておきました。
if (defined($rHash->{"hoge"})) {
 if ($rHash->{"hoge"} == 0) {
  #処理
 } elsif ($rHash->{"hoge"} == 1) {
  #処理
 } elsif ($rHash->{"hoge"} == 2) {
  #処理
 }
}

この辺はもう慣れるしかないですね。

0 件のコメント:

コメントを投稿