的分析考虑这一块的Perl代码,我一个Perl例如自动激活
$array[$x]->{“foo”}->[0]= “January”;
我分析这个代码如下:在“阵列”与指数$ X中的条目是hashref。关于这个散列,当它的键是“foo”时,它的值是一个数组,而这个数组的第0个元素是“1月”。我的分析是否正确?谢谢。
的分析考虑这一块的Perl代码,我一个Perl例如自动激活
$array[$x]->{“foo”}->[0]= “January”;
我分析这个代码如下:在“阵列”与指数$ X中的条目是hashref。关于这个散列,当它的键是“foo”时,它的值是一个数组,而这个数组的第0个元素是“1月”。我的分析是否正确?谢谢。
您结构的分析是正确的,但相关的自动激活的例子是更多的东西一样:你有没有什么分配
#!/usr/bin/env perl
use strict;
use warnings;
use 5.10.0; # say
my @array;
# check all levels are undef in structure
say defined $array[0] ? 'yes' : 'no'; # no
say defined $array[0]{foo} ? 'yes' : 'no'; # no
say defined $array[0]{foo}[0] ? 'yes' : 'no'; # no
# then check again
say defined $array[0] ? 'yes' : 'no'; # yes (!)
say defined $array[0]{foo} ? 'yes' : 'no'; # yes (!)
say defined $array[0]{foo}[0] ? 'yes' : 'no'; # no
注意,其实你所做的一切是为了检查是否东西存在。当您在某个级别x
上检查多级数据结构时,会发生自动版本化,然后突然出现所有级别较低(x-1 ... 0
)的情况。
这意味着
say defined $array[0]{foo}[0] ? 'yes' : 'no';
实际上等同于
$array[0] = {};
$array[0]{foo} = [];
say defined $array[0]{foo}[0] ? 'yes' : 'no';
是的,你的分析是正确的。
这不是一个自动化的分析,它是一个多级数据结构的分析。
我们不知道是否有autoviv会在这里或不,因为我们不能确定任何的中间值是否民主基金...
tadmc有正确的答案。你的分析是正确的。然而,autovivification是另一回事。考虑下面这个例子:
perl -wE 'my @a; $a[1]->{foo}->[0] = "aa"; use Data::Dumper; print Dumper \@a;'
$VAR1 = [
undef,
{
'foo' => [
'aa'
]
}
];
在这个例子中,我们只声明数组@a
。但通过给@a
中的想象结构赋值,我们自动创建它。我们为@a
中的第二个元素添加散列引用,并在该散列中添加对密钥foo
的数组引用。这不是我们所宣称的,perl为我们自动化了它。
我应该指出,TLP的是自动激活的例子太多;只有人们可能期望的那种。我把自己作为autocivification的一个例子,人们可能不会期望(有些人希望Perl不会这样做),即通过查看它来修改某些内容(Heisenberg任何人?)。当你看到人们抱怨autovivification,这就是问题所在。干杯 – 2011-12-22 05:26:31
@JoelBerger我想我更关注他的示例代码中出现的autovivification类型。不过,您的示例更适合演示细节。 – TLP 2011-12-22 05:31:14
+1这是一个很好的例子。 – TLP 2011-12-22 04:54:31
“这意味着......实际上等同于”假设@array为空(或者至少不存在任何已使用的元素)。 – ysth 2011-12-22 06:02:04
@ysth,可以理解,但仍然足够接近政府工作的权利? – 2011-12-22 10:20:38