在多维散列Perl中搜索第一级键
我有Perl中多维散列的值 它的结构是在多维散列Perl中搜索第一级键,perl,multidimensional-array,hash,Perl,Multidimensional Array,Hash,我有Perl中多维散列的值 它的结构是 $hash{$key}{$field}{$date} = $value; 假设我有正确的值和字段 如果值本身是唯一的(与键有1-1关系),那么搜索其键的最快过程是什么 编辑: 我添加了第三个级别,即日期。 并非所有日期都有值,但当它有值时,它将在所有日期中共享 为了简化它,如果它有一个值,那么它是“a”,否则为空 问候,, Innzaayyn您的数据组织不适合进行快速搜索。你必须迭代整个散列。如果要执行多个搜索,最好生成“反向”散列,以便只需在整个散列中
$hash{$key}{$field}{$date} = $value;
假设我有正确的值和字段
如果值本身是唯一的(与键有1-1关系),那么搜索其键的最快过程是什么
编辑:
我添加了第三个级别,即日期。
并非所有日期都有值,但当它有值时,它将在所有日期中共享
为了简化它,如果它有一个值,那么它是“a”,否则为空
问候,,
Innzaayyn您的数据组织不适合进行快速搜索。你必须迭代整个散列。如果要执行多个搜索,最好生成“反向”散列,以便只需在整个散列中迭代一次,而不是每次搜索一次
如果要执行多个搜索,但它们并非都针对同一字段,请按如下所示生成反向哈希:
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 %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 $field = ...;
my $target_value = ...;
if (defined(
my $target_key =
do { no autovivification; $key_by_field_and_value{$field}{$target_value} }
)) {
...
}
my $target_value = ...;
if (defined( my $target_key = $key_by_value{$target_value} )) {
...
}
如果要执行多个搜索,并且它们都针对同一字段,请按如下所示生成反向哈希:
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 %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 $field = ...;
my $target_value = ...;
if (defined(
my $target_key =
do { no autovivification; $key_by_field_and_value{$field}{$target_value} }
)) {
...
}
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)=key(%$h)的有效版本代码>:
您的数据组织不适合进行快速搜索。你必须迭代整个散列。如果要执行多个搜索,最好生成“反向”散列,以便只需在整个散列中迭代一次,而不是每次搜索一次
如果要执行多个搜索,但它们并非都针对同一字段,请按如下所示生成反向哈希:
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 %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 $field = ...;
my $target_value = ...;
if (defined(
my $target_key =
do { no autovivification; $key_by_field_and_value{$field}{$target_value} }
)) {
...
}
my $target_value = ...;
if (defined( my $target_key = $key_by_value{$target_value} )) {
...
}
如果要执行多个搜索,并且它们都针对同一字段,请按如下所示生成反向哈希:
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 %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 $field = ...;
my $target_value = ...;
if (defined(
my $target_key =
do { no autovivification; $key_by_field_and_value{$field}{$target_value} }
)) {
...
}
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)=key(%$h)的有效版本代码>:
$hash{$\}{$field}eq$值,并为键%hash打印“=>$\un”代码>如果您正在搜索第一级密钥。可能需要在那里打印和最后一个。是的,并且还需要带块的常规foreach(顺便说一句,可能有多个满足条件的第一级密钥)。这不是意味着我必须迭代每个可能的键并检查其值是否相同吗?@InnZaayynn:如果这是访问数据结构所需的方式,那么您的结构设计错误。$hash{${$field}eq$value并为键%hash打印“=>$\n”代码>如果您正在搜索第一级密钥。可能需要在那里打印和最后一个。是的,并且还需要带块的常规foreach(顺便说一句,可能有多个满足条件的第一级密钥)。这不是意味着我必须迭代每个可能的键,并检查其值是否相同吗?@InnZaayynn:如果这是访问数据结构所需的方式,那么您的结构设计错误。