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

Kar*_*lek 5 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;
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风格逻辑定义的文档 - 或(//)

虽然它在C语言中没有直接的等价物,但Perl的//运算符与它的C风格有关.事实上,它与||完全相同,只是它测试左手边的定义而不是真实.

因此,$ a // $ b类似于定义的($ a)|| $ b(除了它返回$ a的值而不是定义的值($ a))并产生与定义的相同的结果($ a)?$ a:$ b(除了三元运算符形式可以用作左值,而$ a // $ b不能).

这对于为变量提供默认值非常有用.如果您确实要测试是否定义了$ a和$ b中的至少一个,请使用defined($ a // $ b).

||,//和&&运算符返回最后计算的值(与C的||和&&不同,返回0或1).


运营商优先权和相关性的文件

  • @Karel,`3 || 4`在Perl中返回`3`而不是`1`,即`//`的操作类似于*Perl*逻辑运算符.是的,`0 // 1`返回'0',但没关系. (2认同)
  • 来自perlop,关于1989年做出的语言设计决定:"操作员借用C保持相同的优先关系,即使C的优先级稍微有点麻烦.(这使得学习Perl对C人来说更容易.)" (2认同)