为什么以下代码:
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。
- 如果最后的延迟之后是索引(例如
->[]
或->{}
),则引用表达式本身被评估为左值,即使索引的整体不是。这意味着$y = $x->[0];
和$y = ${ $x }[0];
可以自动激活$x
,即使$y = @{ $x };
不会