您的数据组织不适合进行快速搜索。您将不得不遍历整个哈希。如果您要执行多次搜索,最好生成“反向”哈希,这样您只需遍历整个哈希一次,而不是每次搜索一次。
如果您正在执行多个搜索,并且它们并非都针对同一字段,请按如下方式生成反向哈希:
my %key_by_field_and_value;
for my $key (keys(%hash)) {
my $hash_for_key = $hash{$key};
for my $field (keys(%$hash_for_key)) {
my $hash_for_key_and_field = $hash_for_key->{$field};
defined( my $date = get_any_one_key($hash_for_key_and_field) )
or next;
length( my $value = $hash_for_key_and_field->{$date} )
or next;
$key_by_field_and_value{$field}{$value} = $key;
}
}
那么,搜索就变成了
my $field = ...;
my $target_value = ...;
if (defined(
my $target_key =
do { no autovivification; $key_by_field_and_value{$field}{$target_value} }
)) {
...
}
如果您正在执行多个搜索,并且它们都针对同一个字段,请按如下方式生成反向哈希:
my $field = ...;
my %key_by_value;
for my $key (keys(%hash)) {
my $hash_for_key = $hash{$key};
defined( my $hash_for_key_and_field = $hash_for_key->{$field} )
or next;
defined( my $date = get_any_one_key($hash_for_key_and_field) )
or next;
length( my $value = $hash_for_key_and_field->{$date} )
or next;
$key_by_value{$value} = $key;
}
那么,搜索就变成了
my $target_value = ...;
if (defined( my $target_key = $key_by_value{$target_value} )) {
...
}
如果您只想搜索一次,则必须搜索整个哈希。
my $field = ...;
my $target_value = ...;
my $target_key;
for my $key (keys(%hash)) {
my $hash_for_key = $hash{$key};
defined( my $hash_for_key_and_field = $hash_for_key->{$field} )
or next;
defined( my $date = get_any_one_key($hash_for_key_and_field) )
or next;
length( my $value = $hash_for_key_and_field->{$date} )
or next;
if ($value eq $target_value) {
$target_key = $key;
last;
}
}
if (defined($target_key)) {
...
}
以上两种解决方案都使用my ($key) = keys(%$h);这个高效版本:
sub get_any_one_key {
my ($h) = @_;
my $key = each(%$h);
keys(%$h); # Reset iterator
return $key;
}