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