Perl的&&结果是什么?

Ato*_*Hic 5 perl logical-operators

当我尝试这个:

$a = 1;
$b = 2;
print ($a && $b) . "\n";
Run Code Online (Sandbox Code Playgroud)

结果是2.为什么?

zou*_*oul 15

引用perlop:

"||","//"和"&&"运算符返回最后计算的值(与C的"||"和"&&"不同,返回0或1).

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

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

say_something('foo'); # prints 'foo'
say_something(); # prints 'default'
Run Code Online (Sandbox Code Playgroud)

或者甚至作为流动修饰符:

my $param = shift || die "Need param!";
-f $file && say "File exists.";
Run Code Online (Sandbox Code Playgroud)

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


Tim*_*Tim 11

这就是&&运算符的工作原理:如果左侧参数的计算结果为true,则表达式的值是右侧参数的值.这在perlop页面上有介绍.

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

#!/usr/bin/perl -w

use strict;
Run Code Online (Sandbox Code Playgroud)

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

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

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

  • "使用警告;" 是一种现代化的警告方式 (3认同)