下面是我使用哈希键和哈希值创建的小代码片段,它是一个数组。 我的输入是哈希值(在这种情况下为数组),我必须在 $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;
有没有可能,或者有更好的设计吗?
答案 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;