Pregunta sobre arrays, perl – Perl: referencia de matriz frente a matriz anónima

8

Esta puede ser una pregunta tonta ... El siguiente código muestra el contenido de@arrayref y@arraycont respectivamente. Note la diferencia entre ellos y la forma en que se asignan sus valores. Sé lo que hace la matriz anónima, pero ¿alguien puede explicar por qué hay una diferencia?

Muchas gracias.

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

salidas

<code>5   6   7   8   
5   6   7   8   
1   2   3   4   
5   6   7   8   
</code>

Tu respuesta

3   la respuesta
11

superficial Copia de la matriz:

$arraycont[0] = [@array];

Considerando que esto sólo crea una referencia a ella:

$arrayref[0] = \@array;

Como posteriormente modificas la matriz:

@array = qw(5 6 7 8);

arrayref aún apunta a la misma ubicación de la matriz en la memoria, y así, cuando se elimina la referencia en las declaraciones de impresión, imprime los valores de la matriz actual5 6 7 8.

Gracias, actualizado. yamen
A superficial copia, si@array referencias contenidas entonces[@array] contendría esas mismas referencias. La diferencia profunda / superficial no se aplica en este caso, pero pensé que valía la pena mencionarlo de todos modos. mu is too short
3

@formación. Las referencias son como'transmisión en vivo', obtienes el estado actual. Así que si creas una referencia a@array, como \ @array, cuando la de-referencia siempre obtendrás lo@formación Puntos en el momento de la referencia. Cuando usted de-referir@formación estaba teniendo(5 6 7 8)

Cuando tu lo hagas[@formación] es como grabar eltransmisión en vivo en su disco. Por lo tanto, cuando (re) reproduce el contenido grabado, obtiene lo que se transmitió en el momento de la grabación. Así que cuando te refieras$ arraycont [0] obtienes que@formación Estaba teniendo en el momento de copiar que es
(1 2 3 4)

¡Gracias! Esta es una analogía animada. wen.huang
0

Hiciste referencias almacenadas a una sola matriz en ambos$arrayref[0] y$arrayref[1]. Deberías haber usado diferentes arreglos.

<code>my @refs;

my @array1 = qw(1 2 3 4);
push @refs, \@array1;

my @array2 = qw(5 6 7 8);
push @refs, \@array2;
</code>

En la práctica,my Se ejecuta en cada paso de un bucle, creando una nueva matriz cada vez.

<code>my @refs;
while ( my @row = get() ) {
   push @refs, \@row;
}
</code>

En raras ocasiones en las que tienes que clonar una matriz, puedes usar:

<code>use Storable qw( dclone );

push @refs, [ @row ];       # Shallow clone
push @refs, dclone(\@row);  # Deep clone
</code>

Preguntas relacionadas