Frage an arrays, perl – Perl: Array-Referenz im Vergleich zu anonymen Arrays

8

Dies kann eine dumme Frage sein ... Der folgende Code gibt den Inhalt von aus@arrayref und@arraycont beziehungsweise. Beachten Sie den Unterschied zwischen ihnen und die Art und Weise, wie die Werte von ihnen zugewiesen werden. Ich weiß, was das anonyme Array tut, aber kann jemand erklären, warum es einen Unterschied gibt?

Vielen Dank.

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

Ausgänge

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

Deine Antwort

3   die antwort
0

Sie haben in beiden gespeicherte Verweise auf ein einzelnes Array erstellt$arrayref[0] und$arrayref[1]. Sie sollten verschiedene Arrays verwendet haben.

<code>my @refs;

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

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

In der Praxis,my wird in jedem Durchgang einer Schleife ausgeführt, wobei jedes Mal ein neues Array erstellt wird.

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

In seltenen Fällen, in denen Sie ein Array klonen müssen, können Sie Folgendes verwenden:

<code>use Storable qw( dclone );

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

Dies schafft eineflach Kopie des Arrays:

$arraycont[0] = [@array];

Während dies nur einen Verweis darauf erstellt:

$arrayref[0] = \@array;

Da Sie später das Array ändern:

@array = qw(5 6 7 8);

arrayref verweist weiterhin auf denselben Array-Speicherort im Speicher. Wenn in den print-Anweisungen dereferenziert wird, werden die aktuellen Array-Werte gedruckt5 6 7 8.

A flach kopieren, wenn@array Referenzen enthielten dann[@array] würde die gleichen Referenzen enthalten. Der tiefe / flache Unterschied trifft in diesem Fall nicht zu, aber ich dachte, es wäre trotzdem erwähnenswert. mu is too short
Danke, aktualisiert. yamen
3

Der erste Block speichert die Adresse von@array. Referenzen sind wie'Live-Streaming'Sie erhalten den aktuellen Status. Also, wenn Sie einen Verweis auf erstellen@array, wie \ @array, Wenn Sie die Referenzierung aufheben, erhalten Sie immer was@array Punkte zum Zeitpunkt der De-Referenz. Wenn Sie den Verweis aufheben@array hatte(5 6 7 8)

Wenn Sie das tun[@array] es ist wie das Aufnehmen derLive-Streaming in Ihre Festplatte. Wenn Sie den aufgenommenen Inhalt (erneut) abspielen, erhalten Sie das, was zum Zeitpunkt der Aufnahme gestreamt wurde. Also, wenn Sie sich beziehen$ arraycont [0] du bekommst was@array zum Zeitpunkt des Kopierens hatte das
(1 2 3 4)

Vielen Dank! Dies ist eine lebhafte Analogie. wen.huang

Verwandte Fragen