【问题标题】:perl: precedence of array operationsperl:数组操作的优先级
【发布时间】:2017-06-16 20:53:49
【问题描述】:

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

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

但添加括号:

>> 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,给出@987654332 @。

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

【问题讨论】:

    标签: arrays perl operator-precedence


    【解决方案1】:

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

    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));
    

    * 高于perlop 中优先级表中的“命名一元运算符”(scalar 所属,请查看链接)。

    【讨论】:

    • 那么“术语和列表运算符(向左)”是什么意思?
    【解决方案2】:

    来自 perlop 文档

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

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

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

    并且* 运算符具有比命名一元运算符10. 更高的优先级7.

    所以在scalar @arr * 100 * 有更高的优先级。

    【讨论】:

    • 我不关注。所以scalar 可以根据它是在左边还是右边有不同的优先级?你能从右边叫它吗?我完全迷路了。
    • 可能意思不太清楚,可能是关于list operatorsleftward1.但是rightward21.
    • 是的,但我仍然不关注。 leftward 和 rightward 指的是什么?有scalar 的后缀版本吗?
    • 从示例中,排序采用右侧的列表,但结果也是一个列表,因此附加了列表运算符
    • @ewok,添加了句子的其余部分。现在应该更有意义了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-05
    • 2014-09-30
    • 1970-01-01
    相关资源
    最近更新 更多