2011-12-22 93 views
2

的分析考虑这一块的Perl代码,我一个Perl例如自动激活

$array[$x]->{“foo”}->[0]= “January”; 

我分析这个代码如下:在“阵列”与指数$ X中的条目是hashref。关于这个散列,当它的键是“foo”时,它的值是一个数组,而这个数组的第0个元素是“1月”。我的分析是否正确?谢谢。

回答

11

您结构的分析是正确的,但相关的自动激活的例子是更多的东西一样:你有没有什么分配

#!/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'; 
+1

+1这是一个很好的例子。 – TLP 2011-12-22 04:54:31

+0

“这意味着......实际上等同于”假设@array为空(或者至少不存在任何已使用的元素)。 – ysth 2011-12-22 06:02:04

+0

@ysth,可以理解,但仍然足够接近政府工作的权利? – 2011-12-22 10:20:38

4

是的,你的分析是正确的。

这不是一个自动化的分析,它是一个多级数据结构的分析。

我们不知道是否有autoviv会在这里或不,因为我们不能确定任何的中间值是否民主基金...

1

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为我们自动化了它。

+0

我应该指出,TLP的是自动激活的例子太多;只有人们可能期望的那种。我把自己作为autocivification的一个例子,人们可能不会期望(有些人希望Perl不会这样做),即通过查看它来修改某些内容(Heisenberg任何人?)。当你看到人们抱怨autovivification,这就是问题所在。干杯 – 2011-12-22 05:26:31

+0

@JoelBerger我想我更关注他的示例代码中出现的autovivification类型。不过,您的示例更适合演示细节。 – TLP 2011-12-22 05:31:14