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

问题描述

下面是我使用哈希键和哈希值创建的小代码片段,它是一个数组。 我的输入是哈希值(在这种情况下为数组),我必须在 $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;

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

解决方法

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

您没有说明字符串代表什么,我将称 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;

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...