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

为什么在perl中//的优先级低于相等?,perl,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; 打印(对我来说)非常意外的结果。这是因为/所属的运算符类别,以及= =是一个“相等运算符”,尽管/属于“C型逻辑运算符”的范畴 例如,&&与/属于同一个“类别”,也就是说,当涉及运算符优先级时,下面的两个语

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

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

这是因为
/
所属的运算符类别,以及
=

=
是一个“相等运算符”,尽管
/
属于“C型逻辑运算符”的范畴

例如,
&&
/
属于同一个“类别”,也就是说,当涉及运算符优先级时,下面的两个语句是等效的。这样可能更容易理解

  print "hello world" if $may_be_undefined && 0 == 2;
  print "hello world" if $may_be_undefined // 0 == 2;

尽管Perl的//运算符在C中没有直接的等价物,但它与C风格或。事实上,它与| |完全相同,只是它测试左手边的定义性,而不是它的真实性。

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

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

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



好的,但是为什么//属于这一类等等都是逻辑运算符。我不认为//是C风格的逻辑运算符。@KarelBílek我修改了我的帖子,并添加了有关perl文档的相关信息和链接,本文对此做了很好的解释。@Karel,
3 | | 4
返回
3
而不是
1
在perl中,即
/
的操作与perl逻辑运算符类似。是的,
0//1
返回
0
,但这没关系。Larry Wall(或将其添加到Perl中的任何人)确实将其视为一个逻辑运算符-因此,您最好调整您的期望值,以匹配您正在使用的语言(或决定不使用该运算符)。关于perlop在1989年做出的语言设计决策:“从C中借用的运算符彼此之间保持相同的优先级关系,即使C的优先级有点扭曲。(这使C语言的人更容易学习Perl。)“因为Larry Wall就是这样设计的?