2012-05-01 54 views
8

這可能是一個愚蠢的問題...以下代碼分別輸出@arrayref@arraycont的內容。請注意它們之間的差異以及它們值的分配方式。我知道匿名數組是幹什麼的,但任何人都可以解釋爲什麼會有差異?Perl:數組引用與匿名數組

非常感謝。

@arrayref =(); 
@array = qw(1 2 3 4); 
$arrayref[0] = \@array; 
@array = qw(5 6 7 8); 
$arrayref[1] = \@array; 
print join "\t", @{$arrayref[0]}, "\n"; 
print join "\t", @{$arrayref[1]}, "\n"; 

@arraycont =(); 
@array = qw(1 2 3 4); 
$arraycont[0] = [@array]; 
@array = qw(5 6 7 8); 
$arraycont[1] = [@array]; 
print join "\t", @{$arraycont[0]}, "\n"; 
print join "\t", @{$arraycont[1]}, "\n"; 

輸出

5 6 7 8 
5 6 7 8 
1 2 3 4 
5 6 7 8 

回答

11

這產生了陣列的副本:

$arraycont[0] = [@array];

鑑於這只是創建對它的引用:

$arrayref[0] = \@array;

既然你以後修改數組:

@array = qw(5 6 7 8);

arrayref仍然指向同一個數組的內存位置,因此在打印語句提領時它打印當前數組值5 6 7 8

+1

A *淺*副本,如果'@array '包含引用,那麼'[@array]'將包含那些相同的引用。在這種情況下,深淺區別不適用,但我認爲這值得一提。 –

+0

謝謝,更新。 – yamen

3

第一個塊存儲地址@array。參考像'直播',你會得到當前狀態。 因此,如果您創建一個對@array 的引用,就像\ @array,,當您解除引用時,您將始終得到什麼@array點在解除引用的時刻。 當你去參考@array爲具有(5 6 7 8)

當你[@array]它像記錄流媒體直播插入磁盤。因此,當您(重新)播放錄製的內容時,您將在錄製時獲得流式傳輸的內容 。所以,當你提到$ arraycont [0]你,什麼@array是具有複製的時間是
(1 2 3 4)

+0

謝謝!這是一個生動的比喻。 –