2010-08-05 15 views
13

Ich habe ein Array und versuchte, den Array-Inhalt in einen Hash mit Schlüsseln und Werten zu konvertieren. Index 0 ist ein Schlüssel, Index 1 ist ein Wert, Index 2 ist ein Schlüssel, Index 3 ist ein Wert usw.Wie konvertiere ich ein Array zu einem Hash in Perl?

Aber es produziert nicht das erwartete Ergebnis. Der Code ist unten:

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"; 
} 

die Ausgabe nicht korrekt hergestellt:

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 

Im Ausgabe man sehen kann, dass der Hash nur mit einem Teil, und ein anderer Teil der Anordnung nicht gebildet ist, im Hash erstellt werden.

Kann jemand helfen?

Antwort

35

nichts mehr zu bieten als:

%hash = @array; 
+11

die Daten in @array Angenommen wird als Schlüssel gespeichert, den Wert, Schlüssel, Wert usw. – Hawk

+4

@Hawk und seine Wähler: Bitte nehmen Sie sich Zeit, um die Frage zu lesen. OP sagt dies bereits in seiner/ihrer Frage an. – m0skit0

+5

Dank @Hawk, eine sehr nützliche Notiz für diejenigen von uns, die nur den Titel lesen und sofort zu den Antworten springen;) – rustyx

24

über einen entsprechenden Hinweis, alle Elemente der @array in Schlüssel %hash zu konvertieren. Einige Leute enden hier oben vielleicht wirklich wollen, dies stattdessen ...

Dies ermöglicht die Verwendung von existiert Funktion:

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

Oder% hash = map {$ _ => 1} @array; ') (was sich von Ihrer Lösung in diesen Elementen unterscheidet, die mehrfach vorkommen sind auf 1) eingestellt. –

Verwandte Themen