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。