为什么这两段代码会产生不同的输出?
$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);
给出:但我想要苹果,樱桃或蓝莓!
答案 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;
如果没有短路,die
和next
将无条件评估。
如果要评估两个操作数,则需要临时变量
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"));