为什么//
的优先级低于({至少)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;
打印(对我来说)非常意外结果。
答案 0 :(得分:13)
这是因为//
所属的运营商类别以及==
。
==
是“等于运算符”,但//
属于“ C风格逻辑运算符”类别。
作为一个例子; &&
与//
位于相同的“类别”中,表示下面的两个语句在运算符优先级方面是等效的。那可能会让人更容易理解?
print "hello world" if $may_be_undefined && 0 == 2;
print "hello world" if $may_be_undefined // 0 == 2;
<强> Documentation of C-style Logical Defined-Or ( // ) 强>
虽然它在C中没有直接的等价物,但Perl的//运算符与它的C风格或。事实上,它与||完全相同,只是它测试左手边的定义而不是真实。
因此,$ a // $ b类似于定义的($ a)|| $ b(除了它返回$ a的值而不是定义的值($ a))并产生与定义的相同的结果($ a)? $ a:$ b(除了三元运算符形式可以用作左值,而$ a // $ b不能)。
这对于为变量提供默认值非常有用。如果您确实要测试是否定义了$ a和$ b中的至少一个,请使用defined($ a // $ b)。
||,//和&amp;&amp;运算符返回最后评估的值(与C的||和&amp;&amp;,返回0或1不同)。