【问题标题】:Order of `shift` execution in Perl equationPerl 方程中的 shift 执行顺序
【发布时间】:2019-10-15 16:55:25
【问题描述】:

为了演示我的问题,请考虑以下 Perl 代码:

use strict;
use warnings;
use Data::Dumper;

my @a = (1, 2);
my %h;

sub test {
  $h{shift @_} = shift;
}

&test(@a);
print Dumper(%h);

输出IS如下:

$VAR1 = '2';

$VAR2 = 1;


为什么 Perl 从等式右侧执行第一个 shift,而不是从左侧执行?

为什么输出 IS NOT 如下?

$VAR1 = '1';

$VAR2 = 2;

【问题讨论】:

    标签: perl


    【解决方案1】:

    在大多数语言中,对于大多数运算符来说,操作数的计算顺序是未定义的或至少是未记录的。[1] Perl 也不例外。

    f() + g() 是先打电话给f() 还是g()?嗯,这是未记录的,可能是未定义的。


    现在,事实证明perl 当前非常一致。二元算术运算符将始终在其右侧操作数之前评估其左侧操作数(包括**,它是右结合的),而标量赋值运算符和列表赋值运算符在其 LHS 操作数之前评估其 RHS 操作数.


    1. 值得注意的例外包括标量上下文中的逗号运算符和短路运算符。

      标量上下文中的逗号运算符被记录为在其 RHS 之前评估其 LHS,尽管在列表上下文中调用它时没有这样的保证。

      短路运算符 — 即 &&、||、and、or 和条件运算符 — 必须在任何其他操作数之前评估其 LHS。

    【讨论】:

    • 这是一个主要问题。由于它没有记录,因此将来它可以更改,然后现在以一种方式工作的代码将以不同的方式工作。
    • 它可能已经在不同的计算机之间变化,甚至从运行到运行。 (不会,但可以。)您应该避免在表达式中读取和修改变量。
    猜你喜欢
    • 2017-06-11
    • 2011-08-01
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 2012-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多