有关"Can't use an undefined value as an ARRAY reference"的行为不一致



为什么以下代码:

use strict;
use warnings;
no warnings 'uninitialized';
use Data::Dumper;
my $user;
my @data = @{$user->{ENTERPRISE}}; # Error on this line
print Dumper($user), qq{Done!n};

抛出错误"Can't use an undefined value as an ARRAY reference",而以下代码:

use strict;
use warnings;
no warnings 'uninitialized';
use Data::Dumper;
my $user;
foreach my $enterprise(@{$user->{ENTERPRISES}}) {
    print qq{Enterprise:}, $enterprise;
}
print Dumper($user), qq{Done!n};

不投掷任何东西,而是返回:

$VAR1 = {
          'ENTERPRISES' => []
        };
Done!

两者都有违规代码,但只有一个抛出了错误。

可能的答案:Perl的自动化?

我在这里走对了吗?感谢您的意见。

是的,在第二种情况下发生的事情被称为自活化,它只发生在第二个情况下,因为自活化只发生在lvalues[1]

所以

@{ $x } = $y;

@{ $x //= [] } = $y;

但是

$y = @{ $x };

并不意味着

$y = @{ $x //= [] };

请记住,foreach将其循环变量别名为它迭代的列表中的每个元素,因此这些元素被计算为lvalues。

Autovivification在perlref中有文档记录,您可以通过autoviviization pragma控制autovivilation。


  1. 如果最后的延迟之后是索引(例如->[]->{}),则引用表达式本身被评估为左值,即使索引的整体不是。这意味着$y = $x->[0];$y = ${ $x }[0];可以自动激活$x,即使$y = @{ $x };不会

相关内容

最新更新