2012-05-01 15 views
8

Bu aptalca bir soru olabilir ... Aşağıdaki kod sırasıyla @arrayref ve @arraycont'un içeriğini çıkarıyor. Aralarındaki fark ile bunların değerlerinin atanma biçimini not edin. İsimsiz dizinin ne yaptığını biliyorum ama neden bir fark olduğunu kimse anlatabilir mi?Perl: anonim dizi karşısında dizi başvurusu

Çok teşekkür ederim.

@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"; 

çıkışları

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

cevap

11

Bu dizinin bir sığ kopyasını oluşturur:

: Bu Oysa

$arraycont[0] = [@array];

sadece bir başvuru oluşturur Daha sonra diziyi değiştirmez yana

:

@array = qw(5 6 7 8);

arrayref hala bellekte aynı dizi konumuna işaret ve baskı tablolara indirgenmedikleri zaman bu yüzden şimdiki dizi 5 6 7 8 değerleri yazdırır.

+1

A * sığ * kopyasıdır kopyalama sırasında başlamıştı olsun arraycont 'İçerdiği referanslar o zaman [@array]' aynı referansları içerecektir. Derin/sığ fark bu durumda geçerli değildir ama yine de bahsetmeye değer olduğunu düşündüm. –

+0

Teşekkürler, güncellendi. – yamen

3

İlk blok, @array adresini depolar. REFERANSLAR 'canlı akış' gibidir, şu anki durumu alırsınız. Bu nedenle, @array'a bir başvuru oluşturursanız, örneğin @ @ raray, gibi bir referans oluşturursanız, her zaman referans noktasında @array puan alırsınız. Eğer zaman [@array] yaptığınızda@array(5 6 7 8)

başlamıştı de-başvurmak onun diskinizdeki içine canlı akış kayıt gibi. Kayıtlı içeriği oynattığınızda, kayıt sırasında neyin aktığını görürsünüz. Bahsettiğiniz Yani $ [0] Eğer @array@array `eğer
(1 2 3 4)

+0

Teşekkürler! Bu canlı bir benzeşim. –