为什么以下代码:
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's autovivification?
我在这里走在正确的轨道上吗?感谢您的投入。
答案 0 :(得分:9)
是的,在第二种情况下发生的事情被称为autovivification,它只发生在第二种情况下,因为只有lvalues [1] 才会发生自动修复。
所以
if(div.baseURI){
alert('attached')
}else{
alert('not attached');
}
装置
@{ $x } = $y;
但
@{ $x //= [] } = $y;
并不意味着
$y = @{ $x };
请记住,foreach将其循环变量别名化为它迭代的列表中的每个元素,因此这些元素将被计算为左值。
perlref中记录了自动生成,您可以通过autovivification编译实例控制自动生成。
$y = @{ $x //= [] };
或->[]
),则即使索引整数不是,也会将引用表达式本身计算为左值。这意味着->{}
和$y = $x->[0];
可以自动归档$y = ${ $x }[0];
,即使$x
不会。{/ li>
醇>