如何将数组转换为Perl中的哈希?

Sen*_*mar 14 perl hashmap

我有一个数组,并尝试将数组内容转换为带键和值的哈希.索引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";
}
Run Code Online (Sandbox Code Playgroud)

产生的输出不正确:

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
Run Code Online (Sandbox Code Playgroud)

在输出中,您可以看到散列仅由一个部分组成,而另一部分数组未在散列中创建.

有人可以帮忙吗?

小智 40

没有比它更多:

%hash = @array;
Run Code Online (Sandbox Code Playgroud)

  • 假设@array中的数据存储为键,值,键,值等. (16认同)
  • @Hawk和他的选民:请花时间阅读这个问题.OP已经在他/她的问题中陈述了这一点. (6认同)
  • 感谢@Hawk,对于我们这些只阅读标题并立即跳到答案的人来说,这是一个非常有用的说明;) (6认同)
  • 如何在没有额外变量的情况下进行转换?我尝试了这个 %{ @_ }{ key },但它不起作用(( (2认同)

小智 28

在相关的说明,将所有元素转换@array为键的%hash.在这里结束的一些人可能真的想要这个......

这允许使用exists函数:

my %hash;
$hash{$_}++ for (@array);
Run Code Online (Sandbox Code Playgroud)

  • 或者`%hash = map {$ _ => 1} @array;`(与您的解决方案的不同之处在于多次出现的元素设置为1). (26认同)