2012-05-01 12 views
8

Esto puede ser una pregunta tonta ... El siguiente código genera el contenido de @arrayref y @arraycont respectivamente. Tenga en cuenta la diferencia entre ellos y la forma en que se asignan los valores de ellos. Sé lo que hace la matriz anónima, pero ¿alguien puede explicar por qué hay una diferencia?Perl: referencia a un array frente matriz anónima

Muchas gracias.

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

salidas

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

Respuesta

11

Esto crea un poco profunda copia de la matriz :

$arraycont[0] = [@array];

Mientras que esto sólo crea una referencia a él:

$arrayref[0] = \@array;

Desde luego modificar la matriz:

@array = qw(5 6 7 8);

arrayref todavía señala a la misma ubicación matriz en la memoria, y así, cuando dereferenced en las declaraciones de impresión que imprime los valores de la matriz actual 5 6 7 8.

+1

A * * poco profunda copia, si es '@array 'contiene referencias y' [@array] 'contiene esas mismas referencias. La diferencia profunda/superficial no se aplica en este caso, pero pensé que valía la pena mencionar de todos modos. –

+0

Gracias, actualizado. – yamen

3

El primer bloque almacena la dirección de @array. Las referencias son como 'en vivo', se obtiene el estado actual. Por lo tanto, si crea una referencia a @array, como \ @array, cuando la desreferencia, siempre obtendrá los @array puntos en el momento de la desreferencia. Cuando de-refiere @array estaba teniendo (5 6 7 8)

Al hacer [@array] es como la grabación de la transmisión en vivo en su disco. Así que cuando se (re) reproducir el contenido grabado se obtiene lo era largada en el momento de la grabación. Así que cuando se hace referencia $ arraycont [0] se obtiene lo @array estaba teniendo en el momento de la copia que es
(1 2 3 4)

+0

gracias! esta es una analogía animada. –

Cuestiones relacionadas