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 可用于控制自动激活发生的时间。
当不存在的键被分配给一个变量时,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 可用于控制自动激活发生的时间。