Perl: referência de matriz versus matriz anônima

Esta pode ser uma pergunta boba ... O código a seguir produz o conteúdo de@arrayref e@arraycont respectivamente. Observe a diferença entre eles e a maneira como os valores deles são atribuídos. Eu sei o que a matriz anônima faz, mas alguém pode explicar por que há uma diferença?

Muito obrigado.

<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>

saídas

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

questionAnswers(3)

Você fez referências armazenadas para um único array em ambos$arrayref[0] e$arrayref[1]. Você deveria ter usado diferentes matrizes.

<code>my @refs;

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

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

Na prática,my é executado em cada passagem de um loop, criando uma nova matriz a cada vez.

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

Em raras ocasiões em que você precisa clonar um array, você pode usar:

<code>use Storable qw( dclone );

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

O primeiro bloco armazena o endereço de@array. As reflexões são como'transmissão ao vivo', você recebe o status atual. Então, se você criar uma referência para@array, como \ @array, quando você de referência, você sempre terá o que@array aponta no momento da desreferência. Quando você se desrefere@array estava tendo(5 6 7 8)

Quando você faz[@array] é como gravar otransmissão ao vivo em seu disco. Então, quando você (re) toca o conteúdo gravado, você recebe o que foi transmitido no momento da gravação. Então, quando você se refere$ arraycont [0] você consegue o que@array estava tendo no momento da cópia que é
(1 2 3 4)

 wen.huang01 de mai de 2012 14:55
obrigado! Esta é uma analogia animada.
QuestionSolution

Isso cria umraso cópia da matriz:

$arraycont[0] = [@array];

Considerando que isso apenas cria uma referência a ele:

$arrayref[0] = \@array;

Desde que você modifica mais tarde a matriz:

@array = qw(5 6 7 8);

arrayref ainda aponta para o mesmo local da matriz na memória e, assim, quando não referenciada nas instruções de impressão, imprime os valores atuais da matriz5 6 7 8.

 mu is too short01 de mai de 2012 06:42
A raso cópia, se@array contém referências contidas[@array] conteria essas mesmas referências. A diferença profunda / superficial não se aplica neste caso, mas eu achei que valeu a pena mencionar de qualquer maneira.
 yamen01 de mai de 2012 09:04
Obrigado, atualizado.

yourAnswerToTheQuestion