Perl的“not”运算符没有使用defined()函数按预期工作

时间:2012-10-18 15:48:16

标签: perl

以下代码段未按预期运行:

$k{"foo"}=1;
$k{"bar"}=2; 
if(not defined($k{"foo"}) && not defined($k{"bar"})){
    print "Not defined\n";
}
else{
    print "Defined"
}

由于$ k {“foo”}和$ k {“bar”}都已定义,因此预期输出为“已定义”。但是,运行代码会返回“未定义”。

现在,玩弄代码我意识到在每个not defined()调用周围放置括号会产生所需的结果:

if((not defined($k{"foo"})) && (not defined($k{"bar"}))){print "Not Defined"}

我想这与运营商优先级有关,但有人可以解释到底发生了什么吗?

1 个答案:

答案 0 :(得分:25)

优先问题。

not defined($k{"foo"}) && not defined($k{"bar"})

装置

not ( defined($k{"foo"}) && not defined($k{"bar"}) )

等价
!defined($k{"foo"}) || defined($k{"bar"})

当你真正想要

!defined($k{"foo"}) && !defined($k{"bar"})

解决方案:

  • !defined($k{"foo"}) && !defined($k{"bar"})
  • not defined($k{"foo"}) and not defined($k{"bar"})
  • (not defined($k{"foo"})) && (not defined($k{"bar"}))

PS - 该语言被命名为“Perl”,而不是“PERL”。