使用两个数组进行散列,即具有数组值键的散列

时间:2018-10-11 08:04:30

标签: perl hash

我想使用2个数组进行哈希处理

use warnings;
use strict;
use List::MoreUtils;
use Tie::IxHash;    

my %KEY_VALUE;
tie %KEY_VALUE,'Tie::IxHash';

my @KEY= qw(
0
0
5
1
1
1
2
2
2
2
3
4
);

my @VALUE= qw(
A
B
C
D
E
F
G
H
I
J
K
L
);

@KEY_VALUE{@KEY}=@VALUE;

print join("\t",%KEY_VALUE);

我得到的结果是:

0   B   5   C   1   F   2   J   3   K   4   L

这是因为%KEY_VALUE的值会不断更新为,在这种情况下,它只能有1个键和1个值。

所以,我想知道是否有一种方法可以保存所有值及其对应的键。

预期结果:

0   A   B   5   C   1   D   E   F   2   G   H   I   J   3   K   4   L

2 个答案:

答案 0 :(得分:5)

只需将值推送到每个键下存储的数组引用即可。但是,您不能直接输出结构。

#!/usr/bin/perl
use warnings;
use strict;

use Tie::IxHash;

tie my %key_value,'Tie::IxHash';

my @keys   = qw( 0 0 5 1 1 1 2 2 2 2 3 4 );
my @values = qw( A B C D E F G H I J K L );

push @{ $key_value{ $keys[$_] } }, $values[$_] for 0 .. $#keys;

print join ' ', map "$_ @{ $key_value{$_} }", keys %key_value;

答案 1 :(得分:2)

听起来像是哈希值,其中的值是arrayrefs,其中包含与这两个数组中给定键对应的所有值?像这样:

#!/usr/bin/perl
use warnings;
use strict;
use Tie::IxHash;
# Install from CPAN or your OS's package manager; not a core module
use List::MoreUtils qw/each_array/;

tie my %KEY_VALUE,'Tie::IxHash';    
my @KEY = qw(0 0 5 1 1 1 2 2 2 2 3 4);
my @VALUE = qw(A B C D E F G H I J K L);

my $ea = each_array @KEY, @VALUE;
while (my ($k, $v) = $ea->()) {
  push @{$KEY_VALUE{$k}}, $v;
}

while (my ($k, $av) = each %KEY_VALUE) {
  print "$k @$av ";
}
print "\n";