所以这是
$y = 0 | 2 | 4; # answer is 6
$x = 0 || 2 || 4; # answer is 2
我知道为什么$y
为6
,因为它在每个数字和OR
上使用2 | 4 = 6
运算符,但对$x
...
为什么2
?
答案 0 :(得分:13)
因为2是第一个非虚假项目和逻辑OR短路。它评估为零,这是假,然后是2,这不是假的,所以它完成并返回2.考虑以下示例的输出:
$val = 1;
sub a_proc {
print "a_proc: ", $val++, "\n";
1;
}
$another_val = &a_proc || &a_proc;
这将输出a_proc: 1
。只要a_proc
返回真值,解释器就可以停止评估,因为true
的逻辑OR和任何值都是true
。
答案 1 :(得分:8)
它是一种短路,保值的逻辑或。基本上,它依次评估||
之间的每个事物,直到找到一个非假的,然后它返回那个并且不评估任何后续操作数。
修改强>
perl的逻辑操作有两个重要特性
它们是短路,因为它们首先评估左操作数,如果它是真的(&&
为假),则不评估右操作数
它们是值保留,因为它们将操作数转换为布尔值true或false用于连接(并确定是否评估右操作数),但是表达式的结果是转换为boolean
这两个特性都非常重要,它们结合起来使||
在perl中特别有用 - 远远超过C / C ++,它只是短路而不是值保留。
答案 2 :(得分:5)
虽然运营商看起来很相似,但他们的目的实际上是不同的。
二进制“||”执行短路 逻辑或运算。也就是说,如果 左操作数是真的,右边 甚至没有评估操作数。
与:相比:
二进制“|”返回其操作数ORed 一点一点地在一起。
||
的目的是提出“x || y
真或假?”的答案,而bitwise or
- |
的目的是想出一个操作数的产品(?),或类似“x | y
的结果是什么?”
由于来自||
的唯一有趣的两个结果是真或假,所以该陈述可以(并且是)短路,从而导致这种效果。
在第一个声明中:(0 | 2) = 2, (2 | 4) = 6
在第二个声明中:(0 || 2) = 2, (2 || ...) = 2
有趣的是,bitwise or
在二进制数内设置布尔值。在数字的二进制表示中的位置上添加true或false值。
0000 | 0010 = 0010
0010 | 0100 = 0110
0110 | 0001 = 0111
0111 | 0001 = 0111 # no change
将多个布尔值存储在一个数字中非常方便,可以使用&
(bitwise AND
)进行检查。
0101 & 0100 = 0100 (true)
0101 & 0010 = 0000 (false)
有10种人:理解二进制数的人和不理解二进制数的人。
答案 3 :(得分:2)
EXPR_A || EXPR_B
或多或少等同于
do { my $rv = EXPR_A; if ($rv) { $rv } else { EXPR_B } }
或者用英语,
有时你会看到它们被链接。
EXPR_A || EXPR_B || EXPR_C || EXPR_D
只是
( ( EXPR_A || EXPR_B ) || EXPR_C ) || EXPR_D
所以只需递归地应用上述内容。
您最终会得到第一个返回true的表达式的结果,或者如果没有则返回true的结果。