2012-05-01 15 views
8

Questa potrebbe essere una domanda stupida ... Il codice seguente restituisce il contenuto di @arrayref e @arraycont rispettivamente. Notare la differenza tra loro e il modo in cui i valori vengono assegnati. So cosa fa l'array anonimo, ma qualcuno può spiegare perché c'è una differenza?Perl: riferimento matrice contro array anonimo

Grazie mille.

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

uscite

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

risposta

11

Questo crea un superficiale copia dell'array :

$arraycont[0] = [@array];

considerando questo solo crea un riferimento ad esso:

$arrayref[0] = \@array;

Dal momento che in seguito modificare la matrice:

@array = qw(5 6 7 8);

arrayref punta ancora nella stessa posizione matrice nella memoria, e così quando dereferenziati nelle dichiarazioni di stampa viene stampato valorizza la matrice corrente 5 6 7 8.

+1

A * * copia superficiale, se '@array 'riferimenti contenuti quindi' [@array] 'conterrebbe quegli stessi riferimenti. La differenza profondità/superficialità non si applica in questo caso, ma ho pensato che valesse la pena menzionarla comunque. –

+0

Grazie, aggiornato. – yamen

3

Il primo blocco memorizza l'indirizzo di @array. I REferences sono come "live streaming", si ottiene lo stato corrente. Quindi, se si crea un riferimento a @array, come \ @array, quando si de-referenzia otterrà sempre i punti @array al momento della de-referenza. Quando si de-riferimento @array stava avendo (5 6 7 8)

Quando si esegue [@array] suo come la registrazione del live streaming nel vostro disco. Quindi, quando si (ri) riproduce il contenuto registrato, si ottiene lo streaming al momento della registrazione. Così, quando si fa riferimento $ arraycont [0] si ottiene quello che @array stava avendo al momento della copia che è
(1 2 3 4)

+0

grazie! questa è una vivace analogia. –

Problemi correlati