2010-01-08 8 views

Respuesta

30

Sólo copiarlo:

my %copy = %$hash; 

Si desea otra referencia, simplemente ampliar la referencia original en el constructor de hash anónimo:

my $copy = { %$hash }; 

Para los que preguntan acerca de las copias de poca profundidad: este tipo de asignación solo hace nuevos valores para las teclas de nivel superior. Cualquier valor que sean referencias seguirá siendo la misma referencia en el nuevo hash. Es decir, puede reemplazar un valor en el nuevo hash sin cambiar el hash original. Si simplemente cambia el valor, como empujar un nuevo elemento en un valor de matriz anónimo, ambos hashes obtienen el cambio porque comparten la misma referencia. Como tal, las copias superficiales generalmente no son lo que quieres.

+1

Curiosamente, para crear una copia anónima de un hash referenciado, la sintaxis es '% {{% $ hash}}'. Lo tenía como '% {% $ hash}', que funcionó (sin la parte de copia - devolvió el hash referenciado original, en lugar de una copia) en Perl 5.8.8, pero falló en 5.16 ... –

+0

aviso que ' $ a = $ hash; 'es una copia por ref, es decir, la misma referencia exacta, luego'% b =% $ hash; 'es una copia superficial del hash (desreferenciado), aunque'% b' no es una referencia, entonces '$ c = {% $ hash}' wold será una referencia a la copia superficial expandida dentro de un hash anónimo. Mientras que en el caso mencionas '% {{% $ hash}}' desde el interior, primero quitas la delimitación, luego expandes a hash anónimo y en última instancia desreferenciamos ese hash externo, es decir, no es una referencia al final. – arhak

Cuestiones relacionadas