在Perl中,如何从两个相等长度的数组创建哈希表?

时间:2011-10-11 19:03:48

标签: arrays perl hash

我正在尝试从两个长度相同的数组创建一个哈希值。第一个数组的元素将是“键”,第二个数组的元素将是值。

我尝试了以下代码:FYI:数组“vss”表示虚拟服务器名称,“vsports”表示tcp端口。

my %vsnhash;
@vsnhash {@vss} = @vsports;
print Dumper(\%vsnhash); 

只要第一个数组中的所有元素(名称)都是唯一的,这对我有用。如果不是,则由于重复的密钥,我无法访问散列中的所有keys =>值。

如何为哈希创建一个额外的唯一“级别”或“密钥”,我可以用它来引用具有重复名称(或“密钥”)的数据?

任何建议或替代解决方案都会非常有用。 谢谢

2 个答案:

答案 0 :(得分:4)

for (my $i = 0; $i < @vss; $i++) {
    push (@{$vsnhash->{$vss[$i]}}, $vsports[$i]);
}

然后将每个哈希键作为数组访问。数组将是键引用数量的大小。这里有一些例子:Perl data structure traversal -- reference followed key

答案 1 :(得分:1)

您还可以使用each_array from List::MoreUtils

#!/usr/bin/env perl

use strict; use warnings;

use List::MoreUtils qw( each_array );

my @k = qw(a a b c d d e e f);
my @v = qw(1 2 3 4 5 6 7 8 9);

my %h;
my $it = each_array(@k, @v);

while (my ($k, $v) = $it->()) {
    push @{ $h{ $k } }, $v;
}

use YAML;
print Dump \%h;

输出:

---
a:
  - 1
  - 2
b:
  - 3
c:
  - 4
d:
  - 5
  - 6
e:
  - 7
  - 8
f:
  - 9