4

ハッシュの配列があり、各ハッシュには同じキーが含まれていますが、値は一意です。特定の値に基づいて、ハッシュ参照を保存する必要があります。

正しく理解するには、次の例を参照してください。

my @aoaoh = (
            { a => 1, b => 2 },
            { a => 3, b => 4 },
            { a => 101, b => 102 },
            { a => 103, b => 104 },
    );  

次に、ハッシュ キーaに value が含まれているかどうかを確認します101。はいの場合、ハッシュ参照全体を保存する必要があります。

どうやってするか?

4

3 に答える 3

15
my $key = "a";
my ($ref) = grep { $_->{$key} == 101 } @aoaoh;

またはを使用してList::Utilfirst()

use List::Util 'first';
my $ref = first { $_->{$key} == 101 } @aoaoh;
于 2010-09-24T08:10:56.400 に答える
2

以前は、などforeachのフェッチに使用していましたHash ref

foreach my $href (@aoaoh){
     foreach my $hkeys(keys %{$href}){
           if(${$href}{$hkeys} == 101){
              my $store_ref = $href;
           }
     }
}

ユージーンの助けを借りた後、私はそれを次のように行うことができます

my ($hash_ref) = grep {$_->{a} == 101 } @aoaoh;

または一般的な方法(キーがわからない場合)を使用します

my ($hash_ref) = grep { grep { $_ == 101 } values %$_ } @aoaoh; 
于 2010-09-24T08:38:41.297 に答える
1

このfirst方法は問題なく、これを 1 回か 2 回だけ実行したい場合に使用します。ただし、これを何度も行いたい場合は、次のようにルックアップ テーブルを作成することをお勧めします。

my %hash_lookup;
foreach my $h ( @aoaoh ) { 
    foreach my $k ( keys %$h ) { 
        $hash_lookup{$k}{ $h->{ $k } } = $h;
    }
}

次に、次のように参照を見つけます。

my $ref = $hash_lookup{ $a_or_b }{ $value };
于 2010-09-24T14:20:55.097 に答える