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

17
我有一个数组,尝试将数组内容转换为带有键和值的哈希表。索引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

在输出中,您可以看到散列仅使用一个部分形成,数组的另一部分未在散列中创建。
有人能帮忙吗?
3个回答

47

没什么比这更重要的了:

%hash = @array;

28
假设@array数组中的数据已按键,值,键,值等方式存储。 - Hawk
8
@Hawk和他的支持者们:请花些时间阅读问题。原帖已经在问题中说明了这一点。 - m0skit0
8
谢谢 @Hawk,对于那些只看标题就立即跳到答案的人来说,这是非常有用的提示 ;) - rustyx
2
如何在不使用额外变量的情况下进行转换?我尝试了 %{ @_ }{ key },但它没有起作用 (( - Eugen Konkov

38

相关的是,将@array中的所有元素转换为%hash的键。到这里来的一些人可能真的想要这个...

这样可以使用exists函数:

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

30
这段代码的意思是:将数组@array中的元素作为哈希表%hash的键,对应的值设为1。需要注意的是,如果有多个相同的元素,它们在哈希表中仍只会出现一次,并被赋值为1。与您提供的解决方案不同。 - Keith Thompson
@KeithThompson的变体在功能上与my %hash; $hash {$_} = 1 for (@array);相同。就速度/资源消耗而言,哪个更可取? - Adam Katz

1
my %hash = map { $_ => 1 } @array

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接