Perlの演算子の優先順位
下記の様に、notと&&を混ぜて使うときは、演算子の優先順位に気を付けなければならない。
my $a = +{}; my $b = 0; print "hoge" if not exists $a->{foo} && $b; # hogeが出力される!!
上記の例だと、not exists $a->{foo}よりも先にexists $a->{foo} && $b が評価されてしまうので、if文全体としては真になってしまう。
exists $a->{foo} && $b は、0 && 1となり、偽と判定されるが、この結果に対してnotを適用するので、全体としては真になるのだ。こういうときは丸括弧を使うか、!を使うのが良い。
my $a = +{}; my $b = 0; print "hoge" if (not exists $a->{foo}) && $b; # hogeは出力されない
のように書けばOK。