ふり返る暇なんて無いね

日々のメモ書きをつらつらと。メインブログに書くほどでもないことを流してます

Perlで気軽にorを使うと意図通りに動かないかも

問題

例えば、以下のコード、直感的には$hogeが真なら$hogeが返り、偽の場合は$fugaが返ると思いますよね?

return $hoge or $fuga;

実際には以下のように解釈され、常に$hogeが返ることとなります。

(return $hoge) or $fuga;

この問題5.20から警告が出るようになったので、気づけるのですが、それ以前だと見逃してる可能性があります。 まあ実際5.20使ってみてから問題があるコードを見つけたのですが。

perl5200delta - perl v5.20.0 での変更点 - perldoc.jp

で、これを実際にDeparseしてみるとこんな感じですね。

% perl -MO=Deparse,-print -e 'return $hoge or $fuga'
$fuga unless return $hoge;

解決策

解決方法としては、括弧使うか、||を使ってください。

return ($hoge or $fuga);

# or

return $hoge || $fuga;
% perl -MO=Deparse,-print -e 'return $hoge || $fuga'
return $hoge || $fuga;

% perl -MO=Deparse,-print -e 'return ($hoge or $fuga)'
return $hoge || $fuga;

そんな感じ。 演算子の優先度はちゃんと意識しないとね。

ついーと