关于"不能使用未定义值作为ARRAY参考的行为不一致"

时间:2016-01-06 19:13:47

标签: perl perl5.16

为什么以下代码:

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?

我在这里走在正确的轨道上吗?感谢您的投入。

1 个答案:

答案 0 :(得分:9)

是的,在第二种情况下发生的事情被称为autovivification,它只发生在第二种情况下,因为只有lvalues [1] 才会发生自动修复。

所以

if(div.baseURI){ 
   alert('attached')
 }else{
   alert('not attached');
}

装置

@{ $x } = $y;

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

并不意味着

$y = @{ $x };

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

perlref中记录了自动生成,您可以通过autovivification编译实例控制自动生成。

  1. 如果最终引用之后是索引(例如$y = @{ $x //= [] }; ->[]),则即使索引整数不是,也会将引用表达式本身计算为左值。这意味着->{}$y = $x->[0];可以自动归档$y = ${ $x }[0];,即使$x不会。{/ li>