在Perl中,如何||操作员工作?

时间:2011-05-18 23:35:45

标签: perl

所以这是

$y = 0 | 2 | 4;  # answer is  6

$x = 0 || 2 || 4;  # answer is 2

我知道为什么$y6,因为它在每个数字和OR上使用2 | 4 = 6运算符,但对$x ...

为什么2

4 个答案:

答案 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)

虽然运营商看起来很相似,但他们的目的实际上是不同的。

来自perldoc perlop

  

二进制“||”执行短路   逻辑或运算。也就是说,如果   左操作数是真的,右边   甚至没有评估操作数。

与:相比:

  

二进制“|”返回其操作数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 } }

或者用英语,

  1. 首先,它在标量上下文中评估EXPR_A。
  2. 如果值为true,则返回此值。
  3. 如果值为false,则评估并返回EXPR_B。
  4. 有时你会看到它们被链接。

    EXPR_A || EXPR_B || EXPR_C || EXPR_D
    

    只是

    ( ( EXPR_A || EXPR_B ) || EXPR_C ) || EXPR_D
    

    所以只需递归地应用上述内容。

    您最终会得到第一个返回true的表达式的结果,或者如果没有则返回true的结果。