2010-08-05 25 views
13

Tengo una matriz e intenté convertir los contenidos de la matriz en un hash con claves y valores. El índice 0 es una clave, el índice 1 es un valor, el índice 2 es una clave, el índice 3 es un valor, etc.¿Cómo convierto una matriz a un hash en Perl?

Pero no está produciendo el resultado esperado. El código es el siguiente:

open (FILE, "message.xml") || die "Cannot open\n"; 

$var = <FILE>; 

while ($var ne "") 
{ 
chomp ($var); 
@temp = split (/[\s\t]\s*/,$var); 
push(@array,@temp); 
$var = <FILE>; 
} 

$i = 0; 
$num = @array; 
    while ($i < $num) 
{ 
if (($array[$i] =~ /^\w+/i) || ($array[$i] =~ /\d+/)) 
{ 
# print "Matched\n"; 
# print "\t$array[$i]\n"; 
    push (@new, $array[$i]); 
} 
$i ++; 
} 
print "@new\n"; 


use Tie::IxHash; 
tie %hash, "Tie::IxHash"; 

%hash = map {split ' ', $_, 2} @new; 

while ((my $k, my $v) = each %hash) 
{ 
print "\t $k => $v\n"; 
} 

La salida producida no es correcto:

name Protocol_discriminator attribute Mandatory type nibble value 7 min 0 max F name Security_header attribute Mandatory type nibble value 778 min 0X00 max 9940486857 
     name => Security_header 
     attribute => Mandatory 
     type => nibble 
     value => 778 
     min => 0X00 
     max => 9940486857 

En la salida se puede ver que el hash se forma solamente con una parte, y otra parte de la matriz no es siendo creado en el hash.

¿Alguien puede ayudar?

Respuesta

35

Nada más que:

%hash = @array; 
+11

Suponiendo que los datos en @array se almacena como clave, el valor clave, valor, etc. – Hawk

+4

@Hawk y sus votantes: tómense su tiempo para leer la pregunta. OP ya lo dice en su pregunta. – m0skit0

+5

Gracias @Hawk, una nota muy útil para aquellos de nosotros que solo leemos el título e inmediatamente saltamos a las respuestas;) – rustyx

24

En una nota relacionada, para convertir todos los elementos de @array en claves de %hash. Algunas personas terminan aquí podrían realmente quiere esto en su lugar ...

Esto permite el uso de la función exists:

my %hash; 
$hash{$_}++ for (@array); 
+18

O '% hash = map {$ _ => 1} @array;' (que difiere de tu solución en que los elementos ocurren varias veces) están configurados en 1). –

Cuestiones relacionadas