2010-08-05 6 views
13

J'ai un tableau et essayé de convertir le contenu du tableau en un hachage avec des clés et des valeurs. L'index 0 est une clé, l'index 1 est une valeur, l'index 2 est une clé, l'index 3 est une valeur, etc.Comment convertir un tableau en hash en Perl?

Mais cela ne produit pas le résultat attendu. Le code est ci-dessous:

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 sortie produite est incorrecte:

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 

Dans la sortie, vous pouvez voir que le hachage est formé uniquement avec une part, et une autre partie du tableau n'est pas se créer dans le hachage.

Quelqu'un peut-il aider?

Répondre

35

Rien de plus à lui que:

%hash = @array; 
+11

En supposant que les données sont stockées sous forme @array clé, valeur, clé, valeur, etc. – Hawk

+4

@Hawk et ses électeurs: S'il vous plaît, prenez votre temps pour lire la question. OP le dit déjà dans sa question. – m0skit0

+5

Merci @Hawk, une note très utile pour ceux d'entre nous qui ne lisent que le titre et sautent immédiatement aux réponses;) – rustyx

24

Sur une note liée, pour convertir tous les éléments de @array en clés de %hash. Certaines personnes qui se terminent ici pourraient vraiment envie ce lieu ...

Ceci permet une utilisation de fonction exists:

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

Ou '% hash = map {$ _ => 1} @array;' (qui diffère de votre solution par les éléments qui se produisent plusieurs fois sont définis sur 1). –

Questions connexes