当我尝试这个时:
$a = 1;
$b = 2;
print ($a && $b) . "\n";
结果是2.为什么?
答案 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时返回结果。