En Perl, par défaut, la copie des structures référentielles (comme les tableaux de tableaux ou les hachages de hachages) se fait de façon superficielle : seules les références elles-mêmes sont copiées, et non les contenus imbriqués. Historiquement, cela a souvent entraîné des effets inattendus : une modification de la structure interne dans une copie se reflète dans les autres. Solution : utiliser des méthodes et des modules spécialisés pour le clonage profond, afin de créer une structure autonome avec des éléments imbriqués indépendants.
Exemple de code (en utilisant 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
Caractéristiques clés :
L'opérateur “=” ($copy = $ref) fonctionne-t-il pour le clonage profond ?
Non, l'opérateur “=” ne copie que la référence elle-même. Après une telle assignation, tout changement dans $copy se reflète également dans $ref.
Peut-on utiliser la fonction Data::Dumper pour le clonage profond d'une structure ?
Data::Dumper est un outil de débogage et de sérialisation en chaîne, pas prévu pour restaurer une structure de données en mémoire. Pour une inverse de transformation, il faut eval, ce qui est dangereux et n'est pas recommandé pour des raisons de sécurité et de performance.
dclone fonctionne-t-il toujours correctement avec des objets (références bénies) ?
Storable::dclone clone les objets, mais seulement si la classe ne surcharge pas les méthodes de sérialisation ou ne contient pas d'objets non standards (comme des descripteurs de fichiers ou des références fortes à des ressources externes). Pour des objets complexes, il faut mettre en œuvre les méthodes STORABLE_freeze et STORABLE_thaw.
Un tableau de tableaux est dupliqué par l'opérateur =, des modifications sont apportées à l'une des structures imbriquées — dans toutes les copies, les mêmes modifications sont visibles.
Avantages :
Inconvénients :
On utilise Storable::dclone ou Clone::PP, toutes les structures imbriquées sont indépendantes.
Avantages :
Inconvénients :