2010-12-08 3 views
8

Possible en double:
What's the best way to make a deep copy of a data structure in Perl?En Perl, comment puis-je faire une copie en profondeur d'un tableau?

Dans mon code, je le veux

@[email protected]; 

puis je change @data. Le problème est que @data_new change toujours aussi bien. C'est comme @data_new est juste une référence à ce qui est @data.

Comment faire une copie d'un tableau qui n'est pas une référence mais une nouvelle copie de toutes les valeurs?

@data est un tableau à deux dimensions, soit dit en passant.

Répondre

16

Le code va copier le contenu de la liste dans une nouvelle liste. Toutefois, si vous stockez des références dans la liste (et que vous devez créer un tableau bidimensionnel en Perl), les références sont copiées, pas les objets pointés par les références. Ainsi, lorsque vous manipulez l'un de ces objets référencés à travers une liste, il semble que l'autre liste change, alors qu'en réalité les deux listes contiennent des références identiques.

Vous devrez effectuer une "copie complète" de la liste si vous souhaitez également dupliquer tous les objets référencés. Voir this question pour certains moyens d'accomplir cela.

Compte tenu de votre cas d'un tableau à deux dimensions, cela devrait fonctionner:

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

Ce n'est pas tellement une copie profonde qu'une copie "légèrement moins profonde". :) – hobbs

+0

@hobbs: Je n'ai jamais prétendu que c'était une copie profonde. Lire la phrase précédant immédiatement le code. – cdhowie

+3

Juste ajouter un peu de clarté ... – hobbs

Questions connexes