如何找到Perl多级哈希中的哪些键对应于给定值?

1 perl hash

我有一个如下所示的数据结构:

my %hoh = (
    'T431567' => {
        machin => '01',
        bidule => '02',
        truc   => '03',
    },
    'T123456' => {
        machin => '97',
        bidule => '99',
        truc   => '69',
    },
    'T444444' => {
        machin => '12',
        bidule => '64',
        truc   => '78',
    },
);
Run Code Online (Sandbox Code Playgroud)

我想搜索truc特定值的各种值,并找到与该条目对应的顶级属性.例如,寻找值78,我想找到结果'T444444',因为$hoh{T444444}{truc}78.

我该怎么办呢?

Ilm*_*nen 5

你可以这样做grep:

my @keys = grep { $hoh{$_}{truc} == 78 } keys %hoh;
Run Code Online (Sandbox Code Playgroud)

请注意,如果散列中存在重复值,则可以返回多个键.另请注意,这不是特别有效,因为它必须搜索整个哈希.在大多数情况下它可能很好,但是如果哈希值非常大并且您可能需要针对它运行大量此类查询,那么构建Sobrique建议的反向索引可能更有效:

my %trucs;
foreach my $part (keys %hoh) {
    my $val = $hoh{$part}{truc};
    push @{ $trucs{$val} }, $part;
}
my @keys = @{ $trucs{78} };
Run Code Online (Sandbox Code Playgroud)

或者,更一般地说:

my %index;
foreach my $part (keys %hoh) {
    my %data = %{ $hoh{$part} };
    foreach my $key (keys %data) {
        my $val = $data{$key};
        push @{ $index{$key}{$val} }, $part;
    }
}
my @keys = @{ $index{truc}{78} };
Run Code Online (Sandbox Code Playgroud)