Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在多维散列Perl中搜索第一级键_Perl_Multidimensional Array_Hash - Fatal编程技术网

在多维散列Perl中搜索第一级键

在多维散列Perl中搜索第一级键,perl,multidimensional-array,hash,Perl,Multidimensional Array,Hash,我有Perl中多维散列的值 它的结构是 $hash{$key}{$field}{$date} = $value; 假设我有正确的值和字段 如果值本身是唯一的(与键有1-1关系),那么搜索其键的最快过程是什么 编辑: 我添加了第三个级别,即日期。 并非所有日期都有值,但当它有值时,它将在所有日期中共享 为了简化它,如果它有一个值,那么它是“a”,否则为空 问候,, Innzaayyn您的数据组织不适合进行快速搜索。你必须迭代整个散列。如果要执行多个搜索,最好生成“反向”散列,以便只需在整个散列中

我有Perl中多维散列的值

它的结构是

$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:如果这是访问数据结构所需的方式,那么您的结构设计错误。