2011-12-22 54 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