Perl - 数组哈希:按值查找键

时间:2013-03-23 06:34:23

标签: perl search hash grep

我有一个数组哈希(HoA)。我一直使用$arrayrefs处理此HoA的值。但是,现在我需要根据$key检索$arrayrefs

my %a =  ( 1 => "ONE" , 
           2 => "TWO" ,
           3 => " Three", );

my %aa =  ( 4 => [ 'ONE' , 'TWO', 'THREE'], 
            5 => ['one' , 'two', 'three'],
            6 => ['more', 'dos', 'some'],
);

my @array = ('ONE' , 'TWO', 'THREE');
my $array_ref = \@array;

# returns the $key where the $value is 'ONE'
my ($any_match) = grep { $a{$_} eq 'ONE' } keys %a;
print $any_match."\n"; # this returns '1', as expected.. Good!

my ($match) = grep { $aa{$_} eq @$array_ref } keys %aa;
print $match."\n";  # <--- error: says that match is uninitialized

在上一篇print声明中,我希望它返回4.有人知道怎么做吗?

2 个答案:

答案 0 :(得分:3)

您无法将数组与eq进行比较。一个简单的解决方案是将两个数组转换为字符串并使用eq比较字符串:

my ($match) = grep { join("", @{$aa{$_}}) eq join("", @$array_ref) } keys %aa;

为了比较阵列,您还可以使用CPAN中的许多模块中的一个,例如: Array::CompareList::Compare

答案 1 :(得分:2)

始终use strict; use warnings;。添加use v5.10;,因为Perl(v5.10 +)智能匹配将用于比较数组。执行以下操作:

my ($match) = grep { @{$aa{$_}} ~~ @$array_ref } keys %aa;

此处使用智能运算符~~来比较数组。