web-dev-qa-db-ja.com

Perlで配列をハッシュに変換するにはどうすればよいですか?

私は配列を持っていて、配列の内容をキーと値を持つハッシュに変換しようとしました。インデックス0はキー、インデックス1は値、インデックス2はキー、インデックス3は値などです。

しかし、期待した結果が得られていません。コードは以下のとおりです。

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

生成された出力は正しくありません:

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

出力では、ハッシュが1つの部分のみで形成されており、配列の別の部分がハッシュ内に作成されていないことがわかります。

誰か助けてもらえますか?

14
Senthil kumar

それ以上のものはありません:

%hash = @array;
39
Mysha

関連するメモでは、@arrayのすべての要素を%hashのキーに変換します。ここに到着する人の中には、これを本当に必要とする人もいるでしょう...

これにより、exists関数を使用できます。

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