perl:数组操作的优先级

时间:2017-06-16 20:53:50

标签: arrays perl operator-precedence

我在perl的操作顺序中遇到了一些麻烦。我有以下内容:

>> my $n = 2;
>> my @arr = (1,2,3,4);
>> print $n/scalar @arr * 100;
0.005

但是添加了parens:

>> my $n = 2;
>> my @arr = (1,2,3,4);
>> print $n/(scalar @arr) * 100;
50

查看order of operations,似乎应该发生的第一件事就是列表操作。在这种情况下,遇到的第一个是scalar @arr,它应该返回4.结果表达式应该是print $n/4 * 100,它将遵循标准的操作顺序并产生50

但相反,我假设发生了什么,它首先执行@arr * 100,生成标量值400,然后执行scalar 400,生成400,然后执行$n/400,提供0.005

如果后者正在发生,那么我的问题是scalar在操作顺序中的位置。如果还有其他事情发生,那么我的问题是什么呢?

2 个答案:

答案 0 :(得分:6)

您可以看到Perl如何通过B::Deparse -p运行代码来解析代码:

perl -MO=Deparse,-p script.pl

我尝试了3种不同的方式:

print $n/scalar @arr * 100;
print $n/(scalar @arr) * 100;
print $n/@arr * 100;

这是输出:

print(($n / scalar((@arr * 100))));                                                                                                         
print((($n / scalar(@arr)) * 100));                                                                                                         
print((($n / @arr) * 100));

*高于"命名的一元运算符" (scalar中的perlop所属的地方,请检查链接){/ 3}}。

答案 1 :(得分:1)

来自perlop文档

  

在没有括号的情况下,列表运算符的优先级如此   因为print,sort或chmod非常高或非常低,具体取决于   无论你是在看左侧还是右侧   运营商。例如,在

   @ary = (1, 3, sort 4, 2);
   print @ary;        # prints 1324
     

排序右侧的逗号在排序之前进行评估,但左侧的逗号在之后进行评估。换句话说,列表运算符倾向于吞噬跟随它们的所有参数,然后就前面的表达式表现得像一个简单的TERM。

*运算符的优先级7.高于命名的一元运算符10.

因此,scalar @arr * 100 *具有更高的优先级。

相关问题