2010-02-23 20 views
9

decir que he tenido algo como:¿Cómo puedo hacer una nueva referencia hash vacía en Perl?

# %superhash is some predefined hash with more than 0 keys; 
%hash =(); 
foreach my $key (keys %superhash){ 
    $superhash{ $key } = %hash; 
    %hash =(); 
} 

serían todas las llaves del punto superhash al mismo hash vacío visitada por %hash o iban a ser diferentes hashes vacías?

Si no es así, ¿cómo puedo asegurarme de que apuntan a valores hash vacíos?

+0

@toolic mis disculpas. El código real que tenía era demasiado complicado de publicar, así que lo reescribí para la pregunta. –

Respuesta

16

Necesita utilizar el operador \ para tomar una referencia a un tipo de datos plural (matriz o hash) antes de poder almacenarlo en una ranura individual de cualquiera. Pero en el código de ejemplo dado, si se hace referencia, cada uno sería el mismo hash.

La manera de inicializar su estructura de datos es:

foreach my $key (keys %superhash) { 
    $superhash{ $key } = {}; # New empty hash reference 
} 

Pero inicialización como esto es en gran medida innecesaria en Perl debido a autovivification (creación de objetos contenedores apropiados cuando una variable se utiliza como contenedor).

my %hash; 

$hash{a}{b} = 1; 

Ahora %hash cuenta con una tecla, 'a', que tiene un valor de un hashref anónima, que contiene el par clave/valor b => 1. Las matrices se autovivan de la misma manera.

+0

De acuerdo. No es necesario llevar un hash extra alrededor de cuando Perl no lo necesita. – Zaid

+0

¿Cómo accedería a las claves de $ hash {a}? Cuando intento 'foreach my $ rk (keys $ hash {a}) {...' me da un error: el tipo debe ser hash –

+0

Ah lo tengo: '$ deref = $ hash {a}' y luego 'foreach $ key (keys% $ deref) {...' –

Cuestiones relacionadas