Perl&&amp ;?的结果是什么?

时间:2010-10-24 09:37:09

标签: perl logical-operators

当我尝试这个时:

$a = 1;
$b = 2;
print ($a && $b) . "\n";

结果是2.为什么?

3 个答案:

答案 0 :(得分:15)

引用perlop

  

“||”,“//”和“&&”运营商   返回最后评估的值   (不像C的“||”和“&&”,哪个   返回0或1)。

Perl认为结果2为真,因此当您在逻辑条件中使用&&运算符时,一切都按预期工作。额外的好处是你也可以在其他环境中使用逻辑运算符:

sub say_something {
    say shift || 'default';
}

say_something('foo'); # prints 'foo'
say_something(); # prints 'default'

甚至作为流动修饰符:

my $param = shift || die "Need param!";
-f $file && say "File exists.";

在最后两个示例中,如果&&||运算符不short-circuit,则很高兴意识到它们无法工作。如果shift在第一行有一个真值,那么评估右侧(die…)是没有意义的,因为无论如何整个表达式都是真的。如果文件测试在第二行失败,则无需再次评估右侧,因为整体结果为false。如果逻辑运算符仍然坚持评估整个表达式,我们就不能这样使用它们。

答案 1 :(得分:11)

这就是&&运算符的工作原理:如果左侧参数的计算结果为true,则表达式的值是右侧参数的值。这包含在perlop page

但是,你也要让自己接受一个更微妙的问题。你会发现换行没有打印出来。这是因为如果在print(或任何其他函数名称)之后将表达式放在括号中,则传递给print的参数只是括号中的参数。要注意这一点,请确保打开警告。将这些行放在每个程序的顶部:

#!/usr/bin/perl -w

use strict;

直到你理解他们足以自己决定是否继续使用它们。 : - )

在你的情况下,你会得到这个:

print (...) interpreted as function at p line 7.
Useless use of concatenation (.) or string in void context at p line 7.

答案 2 :(得分:2)

因为&&运算符计算右操作数并在左操作数计算结果为true时返回结果。