2010-12-08 18 views
8

Mögliche Duplizieren:
What's the best way to make a deep copy of a data structure in Perl?In Perl, wie kann ich eine tiefe Kopie eines Arrays machen?

In meinem Code ich tun:

@[email protected]; 

und dann @data ich ändern.

Das Problem ist, dass @data_new immer auch ändert. Es ist wie @data_new ist nur ein Verweis auf, was in @data ist.

Wie erstelle ich eine Kopie eines Arrays, das keine Referenz, sondern eine neue Kopie aller Werte ist?

@data ist übrigens ein zweidimensionales Array.

Antwort

16

Der Code, den Sie haben wird den Inhalt der Liste in eine neue Liste kopieren. Wenn Sie jedoch Referenzen in der Liste speichern (und Sie müssen ein zweidimensionales Array in Perl erstellen), werden die Referenzen kopiert, nicht die Objekte, auf die die Referenzen verweisen. Wenn Sie also eines dieser referenzierten Objekte über eine Liste bearbeiten, sieht es so aus, als würde sich die andere Liste ändern, obwohl beide Listen eigentlich nur identische Referenzen enthalten.

Sie müssen eine "tiefe Kopie" der Liste erstellen, wenn Sie alle referenzierten Objekte auch duplizieren möchten. Für einige Möglichkeiten, dies zu erreichen, siehe this question.

Bei Ihrem Fall einer zweidimensionalen Anordnung, sollte diese Arbeit:

@data_new = map { [@$_] } @data; 
+6

Dies ist nicht so eine tiefe Kopie als eine "etwas weniger seichte" Kopie. :) – hobbs

+0

@hobbs: Ich habe nie behauptet, dass es eine tiefe Kopie war. Lesen Sie den Satz unmittelbar vor dem Code. – cdhowie

+3

Nur ein wenig Klarheit hinzufügen ... – hobbs

Verwandte Themen