我该如何在Perl中将布尔条件结果分配给标量变量?

5
我正在进行以下操作,但它并没有正常工作:
    my $enabled = $hash && 
                  $hash->{'key'} && 
                  $hash->{'key'}->{'enabled'} && 
                  $hash->{'key'}->{'active'};

这是将布尔值分配给标量变量的可接受方式吗?我的代码表现出奇怪的行为,我认为是因为这个赋值。我已经验证了所有这些键的单个值都存在并设置了一个值。
附言:抱歉我是个新手!我谷歌了大约10分钟,但无处找到答案。
1个回答

8
Perl的布尔运算符(如&&||andor)不会返回布尔值,而是返回其中一个参数的值:
say 2 && 3;

输出结果为3

您可以使用双重否定技巧将其强制转换为布尔值:

say !!(2 && 3);
# or
say not not 2 && 3;

输出 1


但是,3不是被认为是真的吗?因为我在某个地方读到,在数字意义上,0 == false,而其余 > 0 的值等于 true。双重否定技巧只是为了风格需要吗? - Haagenti
2
@Grimm 是的,3 是一个真值。然而,Squawk 的代码将会赋值为 $hash->{key}->{active} 的值,如果其他谓词都是真的,则可能是他的问题的来源。例如,如果它被打印出来,连接或用于进一步计算。例如,字符串是真的,但通常是数字零。如果双重否定可以解决问题,则问题就在这里。(注意:所有不等于 0 的数字都是真的,包括负数) - amon
1
非常感谢! :) 只是为了澄清,如果 $hash->{'key'} 存在且不是 Perl 的假值之一,则它将返回一个真值,而如果它不存在或者存在但是是 Perl 的假值之一,则它将返回 false。上述表达式将返回最后一个被评估的值,这对于目的和意图来说,在正确的方式下起到 && 和 || 的作用。这样正确吗?再次感谢! - heypano
@Squawk Jup,我想你明白了。如果在你的 && 序列中任何一个谓词为 false,你将分配该值(无论它是零、空字符串、undef 还是重载对象)。如果哈希条目不存在,则会得到 undef 值。如果所有其他部分都为 true,则会分配最后一个值。 - amon

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