En Perl, al copiar estructuras de datos complejas (por ejemplo, arreglos de arreglos, hashes de hashes), es importante entender la diferencia entre "copia superficial" (shallow copy) y "copia profunda" (deep copy).
Copia superficial crea un nuevo contenedor (por ejemplo, un arreglo o un hash), pero los elementos dentro de él harán referencia a los mismos objetos que el original. Esto puede llevar a un comportamiento inesperado: cambiar los datos en la copia afectará al original.
Copia profunda crea una estructura completamente independiente, copiando recursivamente todos los elementos anidados. Para hacer una copia profunda en Perl, a menudo se utiliza el módulo Storable o [Clone]:
use Storable 'dclone'; my $original = { a => [1, 2, { b => 3 }] }; my $copy = $original; # Copia superficial my $deep = dclone($original); # Copia profunda $copy->{a}[2]{b} = 42; # Cambia tanto $copy como $original! $deep->{a}[2]{b} = 99; # Cambia solo $deep
La copia profunda garantiza que las estructuras estén completamente aisladas entre sí.
¿Cuál es la diferencia entre copiar un arreglo mediante la asignación de una variable y copiar un arreglo mediante una referencia? ¿Cuál es la forma correcta de copiar un arreglo para que los cambios en uno no afecten al otro?
A menudo, se responde que es suficiente con asignar una referencia: $copy = \@arr; — sin embargo, esto es incorrecto, ya que ambas variables apuntan al mismo arreglo. Para una copia independiente se utiliza:
my @copy = @original; # Ahora los arreglos son independientes
Si se requiere copiar estructuras anidadas — se necesita una copia profunda, por ejemplo, a través de Storable::dclone.
Historia
Historia
Historia
Al implementar plantillas de correos electrónicos para envíos masivos, las estructuras originales con objetos anidados se copiaban mediante asignación, los cambios en el texto de la plantilla "se filtraban" entre los envíos, llegando mensajes obsoletos a los destinatarios.