对'和'关键字感到困惑

时间:2012-08-10 03:43:38

标签: perl

为什么这两段代码会产生不同的输出?

    $a = 3;
    ($a == 4) and print "But I wanted apple, cherry, or blueberry!\n" ;

给出无节目输出但是

    $a = 3;
    print "But I wanted apple, cherry, or blueberry!\n" and ($a == 4);

给出:但我想要苹果,樱桃或蓝莓!

4 个答案:

答案 0 :(得分:7)

因为and是所谓的"short circuit" operator。这意味着,如果您有condition1 and condition2,那么将评估第一个条件,并且仅当第一个条件返回true时才评估第二个条件。

所以,在

$a = 3;
($a == 4) and print "But I wanted apple, cherry, or blueberry!\n" ;

条件$a==4为false,因此不评估print语句。

然而,在

$a = 3;
print "But I wanted apple, cherry, or blueberry!\n" and ($a == 4);

print语句完成了它的事情returns true。评估第二个条件(显然是false),但打印已经完成。

答案 1 :(得分:6)

AND和OR的真值表是

p  q  p AND q  p OR q
-  -  -------  ------
F  F     F       F
F  T     F       T
T  F     F       T
T  T     T       T

或者如果我们分组,

p  q  p AND q         p  q  p OR q
-  -  -------         -  -  ------
F  *     F            F  F    F
T  F     F            F  T    T
T  T     T            T  *    T

换句话说,并不总是需要评估两个操作数以了解最终结果。

Perl(以及其他语言)将其作为一项功能纳入其中:它将会短路"通过尽快返回来评估布尔运算符。它不仅是一个很好的优化,而且非常有用。它允许这些结构有意义:

 func(...)
    or die;

 condition(...)
    and next;

如果没有短路,dienext将无条件评估。

如果要评估两个操作数,则需要临时变量

 my $f = f();  # f() has side-effects!
 my $g = g();  # g() has side-effects!
 if ($f && $g) {
    ...
 }

答案 2 :(得分:5)

在Perl中,and是一个短路运营商。

PerlMonks很好地解释了短路运营商:

  

为什么“短路?”

     

Camel II告诉我们,“短路”一词指的是他们“通过评估尽可能少的操作数来确定陈述的真实性”。因此,基本上这些运算符会尽早停止对表达式的评估链。这是他们价值的另一个关键。

基本上,如果and语句的左侧为false,则根本不评估右侧。

答案 3 :(得分:-1)

如果您不确定优先级(哪些运算符首先运行,哪些运行最后运行),您可以随时解析代码,然后在打开括号的最大用法时再次解析它:

perl -MO=Deparse,-p -e '($a == 4) and print "But I wanted apple, cherry, or blueberry!\n" ;'

哪个输出:

(($a == 4) and print("But I wanted apple, cherry, or blueberry!\n"));