为什么在Perl中 // 的优先级低于相等性运算符?

5

为什么在(至少)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;

对我来说输出非常意外。


3
因为 Larry Wall 设计了它? - Wayne
1个回答

13
这是因为//属于"C风格逻辑运算符"这一类别,而==是一个"等式运算符"。举个例子:&&//在同一"类别"中,因此以下两个语句在运算符优先级方面是等效的。这可能更容易理解一些?
  print "hello world" if $may_be_undefined && 0 == 2;
  print "hello world" if $may_be_undefined // 0 == 2;

C风格逻辑定义或运算符(//)的文档

尽管在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)。


运算符优先级和结合性的文档


好的,但是为什么//被归类在这里?&&、||等是逻辑运算符,我不认为//是C风格的逻辑运算符。 - Karel Bílek
@KarelBílek 我修改了我的帖子,并添加了有关此事的相关信息和链接,文本解释得很清楚。 - Filip Roséen - refp
2
@Karel,在Perl中,3 || 4返回的是3而不是1,即//操作符像Perl逻辑运算符一样工作。是的,0//1返回0,但这没问题。 - Jeff Burdges
@JeffBurdges:哦,好的。我还在考虑C语言的逻辑运算符,但它并不合理。但是,Perl的||确实像这样工作。好吧,对我来说,//似乎具有更高的优先级会更有用,但好吧,Larry就是这样设计的。 - Karel Bílek
1
Larry Wall(或者是将其添加到Perl中的人)确实将其视为逻辑运算符 - 因此,您最好调整您的期望以匹配您正在使用的语言(或决定不使用该运算符)。 - Jonathan Leffler
2
从perlop中,关于1989年做出的一项语言设计决策:“运算符从C中借鉴,并保持彼此相同的优先级关系,即使C的优先级有些混乱。(这使得学习Perl对于C程序员来说更容易。)” - mob

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接