为什么在(至少)perl 5.010中,//
比==
的优先级低?
例如,下面的代码:
use 5.010;
my $may_be_undefined = 1;
my $is_equal_to_two = ($may_be_undefined//0 == 2);
say $is_equal_to_two;
对我来说输出非常意外。
为什么在(至少)perl 5.010中,//
比==
的优先级低?
例如,下面的代码:
use 5.010;
my $may_be_undefined = 1;
my $is_equal_to_two = ($may_be_undefined//0 == 2);
say $is_equal_to_two;
对我来说输出非常意外。
//
属于"C风格逻辑运算符"这一类别,而==
是一个"等式运算符"。举个例子:&&
和//
在同一"类别"中,因此以下两个语句在运算符优先级方面是等效的。这可能更容易理解一些? print "hello world" if $may_be_undefined && 0 == 2;
print "hello world" if $may_be_undefined // 0 == 2;
尽管在C语言中没有直接相等的运算符,Perl的// 运算符与其C风格或运算符有关。实际上,它与|| 完全相同,只是它测试左操作数的定义性而不是真值。
因此,$a // $b 类似于 defined($a) || $b(除了它返回 $a 的值而不是 defined($a) 的值),并且产生与 defined($a) ? $a : $b 相同的结果(除了三元运算符形式可以用作左值,而 $a // $b 不能)。
这对于为变量提供默认值非常有用。如果您确实想测试 $a 和 $b 中至少一个是否已定义,请使用 defined($a // $b)。
||、// 和 && 运算符返回最后一个计算的值(与C的||和&& 不同,它们返回0或1)。
3 || 4
返回的是3
而不是1
,即//
操作符像Perl逻辑运算符一样工作。是的,0//1
返回0
,但这没问题。 - Jeff Burdges