当不存在的键被分配给一个变量时,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]生动起来。
发布于 2017-03-01 14:38:29
当不存在的键被分配给一个变量时,Perl真正的自动激活键吗?
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] (因为它没有被取消引用)但从未想过会以相反的方式工作,比如:
my $weird_autovivification = $array->[3];也会使$array->[3]__生动活泼。
不完全是。它自动生成$array,该变量被取消引用。没有分配给$array->[3],因为它没有被取消引用。
提示:自生化实用程序可以用于控制自动生动化发生的时间。
发布于 2017-03-01 13:49:35
但从未想过会以相反的方式工作,在那里:
my $weird_autovivification = $array->[3];也将生动地呈现出$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将自动将链中的最后一个环节之外的所有内容都自动显示出来。当你想起来的时候,这是很有道理的。Perl需要自动激活链中的一个链接,以便检查下一个链接是否存在。
https://stackoverflow.com/questions/42532298
复制相似问题