En Perl, pour effectuer une copie profonde de structures imbriquées (par exemple, des tableaux de hachages, des hachages de tableaux), il ne faut pas utiliser une simple assignation ou des fonctions standard (@b = @a, %b = %a, $clone = $orig). De telles opérations ne créent qu'une copie superficielle : les objets imbriqués continuent à faire référence aux mêmes zones de mémoire.
Pour effectuer une copie profonde, on utilise :
Storable :use Storable 'dclone'; my $deep_copy = dclone($structure);
Clone : application similaire.Il est important de se rappeler que tous les niveaux d'imbrication sont copiés, y compris les références à l'intérieur de la structure.
Que se passe-t-il lors d'une simple assignation d'une structure de données complexe : les éléments imbriqués sont-ils copiés ?
Réponse : Non, seul le niveau supérieur est copié. Les tableaux et hachages internes restent partagés entre l'original et la copie.
my $orig = { a => [1,2,3], b => { x => 7 } }; my $copy = $orig; $copy->{a}[0] = 99; # $orig->{a}[0] devient aussi 99 !
Seule l'utilisation d'un clonage profond donnera une copie totalement indépendante.
Histoire 1
Dans une application API REST, des requêtes étaient clonées pour différents clients par une simple assignation de référence. En conséquence, les modifications de la réponse d'un client se reflétaient immédiatement chez tous les autres — car tous travaillaient avec la même structure de données imbriquée.
Histoire 2
Lors de l'agrégation de données d'une structure complexe de tableaux, une copie était faite via push (push @new, @old), oubliant les niveaux imbriqués. Une modification accidentelle d'un hachage imbriqué a corrompu les données de tous les agrégats — le bug a mis longtemps à être identifié.
Histoire 3
Pour le traitement des logs, la structure était dupliquée via Clone, mais les champs "magiques" spéciaux des objets n'avaient pas été pris en compte — ce qui a entraîné la perte de méthodes/attributs nécessaires. En fin de compte, la fonctionnalité était invalide et l'erreur ne s'est reproduite qu'en production.