Perl 自动激活赋值

Perl auto-vivification on assignment

当不存在的键被分配给一个变量时,Perl 真的会自动激活键吗?

我有这个代码:

my $variable = $self->{database}->{'my_key'}[0];

变量 $self->{database}->{'my_key'}[0] 在我的散列中未定义,但如果我在赋值后打印一个 Dumper,我很惊讶 my_key 被创建了。

我知道这个案例的功能:

use Data::Dumper;

my $array;

$array->[3] = 'Buster';  # autovivification
print Dumper( $array );

这会给我结果:

$VAR1 = [ undef, undef, undef, 'Buster' ];

但没想到会以相反的方式工作,其中: my $weird_autovivification = $array->[3]; 也将活跃 $array->[3].

But never expected to work the other way arround, where : my $weird_autovivification = $array->[3]; will also vivificate $array[3].

事情不是这样的。

$ perl -MData::Dumper -E'$foo=$array->[3]; say Dumper $array'
$VAR1 = [];

执行该代码已将 $array 变成一个数组引用(以前,它是未定义的),但它没有将 $array->[3] 设置为任何内容。

如果我们添加另一层查找,我们会得到稍微不同的行为:

$ perl -MData::Dumper -E'$foo=$array->[0][3]; say Dumper $array'
$VAR1 = [
          []
        ];

在这里,Perl 创建了 $array->[0] 并将其设置为对空数组的引用,但它没有影响 $array->[0][3].

一般来说,当您在一个复杂的数据结构中进行查找链时,Perl 将自动激活除链中最后一个 link 之外的所有查找。当您考虑它时,这很有意义。 Perl 需要自动激活链中的一个 link 以便它可以检查下一个是否存在。

Does Perl real auto-vivifies key when the unexisting key is assigned to a variable?

Perl 在变量(包括数组元素和散列值)被取消引用.

时自动激活它们
$foo->{bar}   [ $foo dereferenced as a hash   ]    ≡    ( $foo //= {} )->{bar}
$foo->[3]     [ $foo dereferenced as an array ]    ≡    ( $foo //= [] )->[3]
$$foo         [ $foo dereferenced as a scalar ]    ≡    ${ $foo //= do { my $anon } }
etc

这意味着

$self->{database}->{'my_key'}[0]

自动激活

  • $self(如果未定义则为哈希引用)
  • $self->{database}(如果未定义则指向哈希引用)
  • $self->{database}->{'my_key'}(如果未定义则为数组引用)

但不是

  • $self->{database}->{'my_key'}[0](因为它没有被取消引用)

But never expected to work the other way arround, where : my $weird_autovivification = $array->[3]; will also vivify $array->[3].

不完全是。它自动激活 $array,变量被取消引用。 $array->[3] 未被取消引用,因此未分配任何内容。


提示:autovivification pragma 可用于控制自动激活发生的时间。