En Perl, por defecto, la copia de estructuras referenciadas (por ejemplo, arreglos de arreglos o hashes de hashes) se realiza de forma superficial: solo se copian las referencias, no el contenido anidado. Esto ha llevado históricamente a efectos inesperados: los cambios en la estructura interna de una copia se reflejan en las otras. Solución: usar métodos y módulos especializados para clonación profunda, para crear una estructura autónoma con elementos anidados independientes.
Ejemplo de código (usando Storable):
use Storable 'dclone'; my $original = { a => [1, 2, { x => 10 }] }; my $copy = dclone($original); $copy->{a}[2]{x} = 20; print $original->{a}[2]{x}; # 10
Características clave:
¿Funciona el operador “=” ($copy = $ref) para copiar profundamente?
No, el operador “=” solo copia la referencia misma. Después de tal asignación, cualquier cambio en $copy se refleja también en $ref.
¿Se puede usar la función Data::Dumper para copiar profundamente una estructura?
Data::Dumper es una herramienta para depuración y serialización a cadena, no está diseñada para restaurar estructuras de datos en memoria. Para la conversión inversa se necesita eval, lo cual es peligroso y no se recomienda por razones de seguridad y rendimiento.
¿Siempre funciona dclone correctamente con objetos (referencias bendecidas)?
Storable::dclone clona objetos, pero solo si la clase no sobrecarga los métodos de serialización o no contiene objetos no estándar (por ejemplo, descriptores de archivos o referencias fuertes a recursos externos). Para objetos complejos es necesario implementar los métodos STORABLE_freeze y STORABLE_thaw.
Un arreglo de arreglos se duplica con el operador =, se realizan cambios en una de las estructuras anidadas: todos los cambios son visibles en todas las copias.
Pros:
Contras:
Se utiliza Storable::dclone o Clone::PP, todas las estructuras anidadas son independientes.
Pros:
Contras: