我有一个如下所示的数据结构:
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.
我该怎么办呢?
你可以这样做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)