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

9
以下代码片段未按预期工作:
$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个回答

27

优先级问题。

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"。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接