从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字符串,但==用于数字。对于浮点数,==由于不精确,甚至可能会很棘手。


以上是从Perl中给定部分键匹配的多维散列中获取散列键的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>