的分析考慮這一塊的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