如何通过数组哈希中的值获取哈希的键



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

相关内容

  • 没有找到相关文章

最新更新