2013-03-23 85 views
2

我有一个数组哈希(HoA)。我一直在使用$arrayrefs来处理这个HoA的值。但是,现在我需要根据$arrayrefs检索$keyPerl - 数组哈希:按值查找

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.有没有人知道如何做到这一点?

回答

3

您不能与eq比较阵列。一个简单的解决办法是把两个阵列成字符串以及比较所述串使用eq

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

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

2

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

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

此处使用智能运算符~~来比较阵列。