解除引用未定义的数组引用时的Perl vivification问题

kur*_*der 16 perl autovivification

我很难理解为什么以下有效:

my $array_reference;
foreach $element (@{$array_reference}) {
# some code
}
Run Code Online (Sandbox Code Playgroud)

而以下不起作用

my $array_reference;
if (scalar (@{$array_reference}) {
    # some code here
}
Run Code Online (Sandbox Code Playgroud)

我知道perl带来生命(自动生存)未定义的引用.但我仍然感到困惑,因为后一个代码段抛出FATAL.

ike*_*ami 11

在左值上下文中取消引用autovivify(意味着在需要可修改的值时),并且foreach创建左值上下文.

>perl -E"$$x = 1;  say $x;"
SCALAR(0x74b024)

>perl -E"++$$x;  say $x;"
SCALAR(0x2eb024)

>perl -E"\$$x;  say $x;"
SCALAR(0x30b024)

>perl -E"sub {}->($$x);  say $x;"
SCALAR(0x27b03c)

>perl -E"for ($$x) {}  say $x;"
SCALAR(0x25b03c)
Run Code Online (Sandbox Code Playgroud)

最后两个创建左值上下文,因为它们需要一个别名$_[0]$_(分别)别的值.


yst*_*sth 7

Perl在这个领域有不一致的地方,但一般来说,可能修改结构的代码会自动生成,而代码则不会自动生成.如果它没有自动生成,它会尝试取消引用未定义的值,这会触发警告,或者在use strict "refs"异常情况下触发警告.