2010-12-08 9 views
8

Duplicar posible:
What's the best way to make a deep copy of a data structure in Perl?En Perl, ¿cómo puedo hacer una copia profunda de una matriz?

En mi código que hago:

@[email protected]; 

y luego me cambio @data.

El problema es que @data_new siempre cambia también. Es como @data_new es solo una referencia a lo que hay en @data.

¿Cómo hago una copia de una matriz que no es una referencia sino una nueva copia de todos los valores?

@data es una matriz bidimensional, por cierto.

Respuesta

16

El código que tiene será y copiará el contenido de la lista a una nueva lista. Sin embargo, si está almacenando referencias en la lista (y debe hacerlo para crear una matriz bidimensional en Perl), se copian las referencias , no los objetos a los que apuntan las referencias. Entonces, cuando manipulas uno de estos objetos referenciados a través de una lista, parece que la otra lista está cambiando, cuando en realidad ambas listas solo contienen referencias idénticas.

Tendrá que hacer una "copia profunda" de la lista si desea duplicar todos los objetos referenciados también. Vea this question para algunas maneras de lograr esto.

Dada su caso de una matriz de dos dimensiones, esto debería funcionar:

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

Esto no es tanto una copia profunda como una copia "un poco menos profunda". :) – hobbs

+0

@hobbs: Nunca dije que fuera una copia profunda. Lea la oración inmediatamente anterior al código. – cdhowie

+3

Simplemente agregando un poco de claridad ... – hobbs

Cuestiones relacionadas