从Perl中给定部分键匹配的多维散列中获取散列键
新手来了 我正在尝试从哈希散列中获取第一个键。假设我构造了一个散列,如下所示:
%hash;
$first_key;
$hash{'First'}{'Float'}=0.1;
$hash{'First'}{'XY'}='X0Y0';
$hash{'First'}{'Score'}=100;
我用
$hash{$_}{'Float'} eq 0.1 && $hash{$_}{'XY'} eq 'X0Y0'
and $first_key = $_ for keys %hash;
在只有一个时找到第一个键。但是如果有多个匹配项,我如何获取数组或循环以获取第一个键,$hash{$_}{'Float'} eq 0.1 && $hash{$_}{'XY'} eq 'X0Y0'如果有另一个如下所示的集合:
$hash{'Second'}{'Float'}=0.1;
$hash{'Second'}{'XY'}='X0Y0';
$hash{'Second'}{'Score'}=90;
提前致谢。
回答
使用grep从列表中选择:
my @matching_keys = grep $hash{$_}{Float} == 0.1 && $hash{$_}{XY} eq 'X0Y0',
keys %hash;
您可以使用相同的方法选择第一个:
my ($first) = grep ...
括号需要保留grep在列表上下文中,就像在标量上下文中一样,它返回匹配的数量。您可以改用列表下标:
my $first = (grep ...)[0];
或者,您可以使用first与上下文无关的List::Util:
use List::Util qw{ first };
my $first = first {
$hash{$_}{Float} == 0.1 && $hash{$_}{XY} eq 'X0Y0'
} keys %hash;
请注意,我用于eq字符串,但==用于数字。对于浮点数,==由于不精确,甚至可能会很棘手。