Wie kann ich in Perl eine tiefe Kopie eines Arrays erstellen? [Duplikat]

8

In meinem Code tue ich:

%Vor%

und dann ändere ich @data .

Das Problem ist, dass sich @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.

    
Hermann Ingjaldsson 08.12.2010, 16:51
quelle

2 Antworten

16

Der Code, den Sie haben, kopiert den Inhalt der Liste in eine neue Liste. 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 ob sich die andere Liste ändert, 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. Siehe dazu Frage für einige Möglichkeiten, dies zu erreichen.

Wenn Sie von einem zweidimensionalen Array ausgehen, sollte dies funktionieren:

%Vor%     
cdhowie 08.12.2010, 16:53
quelle
27

Siehe perlfaq4's " Wie drucke oder kopiere ich eine rekursive Datenstruktur? . Verwenden Sie die Methode dclone von Storable .

%Vor%     
Emil Sit 08.12.2010 17:46
quelle

Tags und Links