为什么以下代码:
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的自动化?
我在这里走在正确的轨道上吗?感谢您的输入.
是的,在第二种情况下发生的事情被称为autovivification,它只发生在第二种情况下,因为自动修复只发生在左值[1].
所以
@{ $x } = $y;
手段
@{ $x //= [] } = $y;
但
$y = @{ $x };
不代表
$y = @{ $x //= [] };
请记住,foreach将其循环变量别名为其迭代的列表的每个元素,因此这些元素将被计算为左值.
perlref中记录了自动生成,您可以通过autovivification pragma 控制自动生成.
如果最终deferencing后跟一个索引(例如->[]
或->{}
),参考表达本身被评估为一个左值即使索引整体不.这意味着即使不这样做$y = $x->[0];
也$y = ${ $x }[0];
可以自动生成.$x
$y = @{ $x };