2012-05-01 18 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];

はそれへの参照を作成します後で配列を変更するので

@array = qw(5 6 7 8);

arrayrefはまだメモリ内の同じアレイの位置を指し、印刷書類に逆参照するときので、現在のアレイは5 6 7 8値印刷します。

+1

*浅い*コピーでコピーの時に持っていたものを手に入れます'参照が含まれていれば' [@array] 'には同じ参照が含まれます。深い/浅い相違はこの場合は当てはまりませんが、とにかく言及する価値があると思いました。 –

+0

ありがとうございました。感謝! – yamen

3

最初のブロックには、@ arrayというアドレスが格納されています。参照は「ライブストリーミング」のようなもので、現在のステータスを取得します。 @arrayへの参照を作成すると、\ @配列のようにを参照するときに、@ arrayが参照解除の時点を常に指しています。 あなたはあなたのディスクにライブストリーミングを記録するように[@array]その操作を行うと@array(5 6 7 8)

を持っていたデ・参照する場合。だから、録画したコンテンツを(再)再生すると、録画時には が流れています。あなたは$ arraycontを参照するときに[0]あなたは@array `場合@arrayは、
(1 2 3 4)

+0

ありがとう!これは活発なアナロジーです。 –