2

配列のハッシュ (HoA) があります。を使用して、この HoA の値を処理しています$arrayrefs$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 を返したいと思います。これを行う方法を知っている人はいますか?

4

2 に答える 2

3

配列を と比較することはできませんeq。簡単な解決策は、両方の配列を文字列に変換し、次を使用して文字列を比較することeqです。

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

配列を比較するために、CPAN の多くのモジュールの 1 つを利用することもできArray::CompareますList::Compare

于 2013-03-23T06:48:41.010 に答える
2

いつもuse strict; use warnings;use v5.10;Perl の (v5.10+) スマート マッチングが配列の比較に使用されるため、追加します。以下をせよ:

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

ここでは、スマート演算子~~を使用して配列を比較しています。

于 2013-03-23T06:54:06.477 に答える