Il suffit de le copier:
my %copy = %$hash;
Si vous voulez une autre référence, développez simplement la référence originale dans le constructeur de hachage anonyme:
my $copy = { %$hash };
Pour ceux qui se demandent sur les copies peu profondes: ce genre d'affectation crée uniquement de nouvelles valeurs pour les clés de niveau supérieur. Toutes les valeurs qui sont des références seront toujours la même référence dans le nouveau hachage. Autrement dit, vous pouvez remplacer une valeur dans le nouveau hachage sans modifier le hachage d'origine. Si vous modifiez simplement la valeur, par exemple en poussant un nouvel élément sur une valeur de tableau anonyme, les deux hachages obtiennent la modification car ils partagent la même référence. En tant que tel, les copies superficielles ne sont généralement pas ce que vous voulez.
Fait intéressant, pour créer une copie anonyme d'un hachage référencé, la syntaxe est '% {{% $ hash}}'. Je l'avais comme '% {% $ hash}', qui a fonctionné (sans la partie de copie - il a retourné le hash référencé original, plutôt qu'une copie) en Perl 5.8.8, mais a échoué en 5.16 ... –
notez que ' $ a = $ hash; 'est une copie par ref, c'est-à-dire exactement la même référence, alors'% b =% $ hash; 'est une copie superficielle du hash (déréférencé), bien que'% b' ne soit pas une référence, alors '$ c = {% $ hash}' wold serait une référence à la copie superficielle développée dans un hachage anonyme. Alors que dans le cas où vous mentionnez '% {{% $ hash}}' de la première fois que vous derefencez, étendez-le en hash anonyme et déréférenciez finalement ce hash externe, c'est-à-dire que ce n'est pas une référence à la fin. – arhak