为什么//在perl中的优先级低于相等性?

时间:2011-12-12 02:24:57

标签: perl

为什么//的优先级低于({至少)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;

打印(对我来说)非常意外结果。

1 个答案:

答案 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不同)。


Documentation of Operator Precedence and Associativity