新手来了。我正在尝试从哈希值中获取第一个键。假设我构造了一个散列的散列,如下所示:\
%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;
提前谢谢。
发布于 2021-05-27 15:01:23
使用grep从列表中选择:
my @matching_keys = grep $hash{$_}{Float} == 0.1 && $hash{$_}{XY} eq 'X0Y0',
keys %hash;
您可以使用相同的命令来选择第一个:
my ($first) = grep ...
需要使用括号将grep
保存在列表上下文中,因为在标量上下文中,它返回匹配的数量。您可以改用列表下标:
my $first = (grep ...)[0];
或者,您可以使用List::Util中的first
,它不是上下文相关的:
use List::Util qw{ first };
my $first = first {
$hash{$_}{Float} == 0.1 && $hash{$_}{XY} eq 'X0Y0'
} keys %hash;
注意,我对字符串使用了eq
,而对数字使用了==
。对于浮点数,即使是==
也会因为不精确而变得棘手。
发布于 2021-05-27 15:43:16
这里有另一种方法来实现同样的目的。
#!/usr/bin/perl
use strict;
use warnings;
use List::Util qw{ first };
my %hash = (
"First" => {
"Float" => "1",
"XY" => "X0Y0",
"Score" => "100"
},
"Second" => {
"Float" => "0.1",
"XY" => "X0Y0",
"Score" => "90"
},
);
foreach my $key (keys %hash){
if(($hash{$key}{"Float"} == 0.1) && ($hash{$key}{"XY"} eq 'X0Y0')){
print "First Matched Key:$key";
last;
}
}
请注意:数字和字符串的比较运算符(等于)分别使用==
和eq
实现。
https://stackoverflow.com/questions/67724742
复制