我在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
在操作顺序中的位置。如果还有其他事情发生,那么我的问题是什么呢?
答案 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));
答案 1 :(得分:1)
来自perlop文档
在没有括号的情况下,列表运算符的优先级如此 因为print,sort或chmod非常高或非常低,具体取决于 无论你是在看左侧还是右侧 运营商。例如,在
中@ary = (1, 3, sort 4, 2); print @ary; # prints 1324
排序右侧的逗号在排序之前进行评估,但左侧的逗号在之后进行评估。换句话说,列表运算符倾向于吞噬跟随它们的所有参数,然后就前面的表达式表现得像一个简单的TERM。
*
运算符的优先级7.
高于命名的一元运算符10.
因此,scalar @arr * 100
*
具有更高的优先级。