如何通过数组散列中的值获取散列的键

时间:2021-02-05 06:34:57

标签: perl

下面是我使用哈希键和哈希值创建的小代码片段,它是一个数组。 我的输入是哈希值(在这种情况下为数组),我必须在 $ENV 哈希中搜索所有数组并获取哈希键

例如,如果我搜索 m3d1 ,则输出应为 TEST3

  use strict;
  use warnings;
  use Data::Dumper;
  my %ENV;
  
  $ENV{"TEST3"}=["m3d1","m3d2"] ;
  $ENV{"TEST4"}=["m4d1","m4d2"] ;
  $ENV{"TEST5"}=["m5d1","m5d2"] ;
  $ENV{"TEST6"}=["m6d1","m6d2"] ;
  print Dumper \@keys;
  print Dumper \@values;

有没有可能,或者有更好的设计吗?

1 个答案:

答案 0 :(得分:1)

当然有可能。我们可以访问数据结构中的每个值,直到找到匹配的值。

您没有说明字符串代表什么,我将称 TEST3 为一组,而我将称 m3d1 为主机。以下代码段不假设主机仅预设在一组中。

my @groups;
for my $group (keys(%ENV)) {
   for my $host (@{ $ENV{$group} }) {
      if ($host eq $target_host) {
         push @groups, $group;
      }
   }
}

die("Not found\n") if !@groups;

say for @groups;

但这效率不高。如果您打算进行多次查找,这会很慢。

让我们先把结构翻过来。

my %groups_by_host;
for my $group (keys(%ENV)) {
   for my $host (@{ $ENV{$group} }) {
      push @{ $groups_by_host{$host} }, $group;
   }
}

以上产生

my %groups_by_host = (
   m3d1 => [ "TEST3" ],
   m3d2 => [ "TEST3" ],
   m4d1 => [ "TEST4" ],
   m4d2 => [ "TEST4" ],
   m5d1 => [ "TEST5" ],
   m5d2 => [ "TEST5" ],
   m6d1 => [ "TEST6" ],
   m6d2 => [ "TEST6" ],
);

然后,搜索变得即时。

my $groups = $groups_by_host{$target_host}
   or die("Not found\n");

say for @$groups;