首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在给定Perl中的部分键匹配的情况下,从多维散列中获取散列键

在给定Perl中的部分键匹配的情况下,从多维散列中获取散列键
EN

Stack Overflow用户
提问于 2021-05-27 22:53:42
回答 2查看 81关注 0票数 0

新手来了。我正在尝试从哈希值中获取第一个键。假设我构造了一个散列的散列,如下所示:\

代码语言:javascript
运行
复制
%hash;
$first_key;
$hash{'First'}{'Float'}=0.1;
$hash{'First'}{'XY'}='X0Y0';
$hash{'First'}{'Score'}=100;

我使用

代码语言:javascript
运行
复制
$hash{$_}{'Float'} eq 0.1 && $hash{$_}{'XY'} eq 'X0Y0'
    and $first_key = $_ for keys %hash;

在只有一个密钥的时候找到第一个密钥。但是,如果$hash{$_}{'Float'} eq 0.1 && $hash{$_}{'XY'} eq 'X0Y0'有多个匹配项,如果有另一个类似下面的集合,我如何获得一个数组或循环来获得第一个键:

代码语言:javascript
运行
复制
$hash{'Second'}{'Float'}=0.1;
$hash{'Second'}{'XY'}='X0Y0';
$hash{'Second'}{'Score'}=90;

提前谢谢。

EN

回答 2

Stack Overflow用户

发布于 2021-05-27 23:01:23

使用grep从列表中选择:

代码语言:javascript
运行
复制
my @matching_keys = grep $hash{$_}{Float} == 0.1 && $hash{$_}{XY} eq 'X0Y0',
                    keys %hash;

您可以使用相同的命令来选择第一个:

代码语言:javascript
运行
复制
my ($first) = grep ...

需要使用括号将grep保存在列表上下文中,因为在标量上下文中,它返回匹配的数量。您可以改用列表下标:

代码语言:javascript
运行
复制
my $first = (grep ...)[0];

或者,您可以使用List::Util中的first,它不是上下文相关的:

代码语言:javascript
运行
复制
use List::Util qw{ first };

my $first = first {
    $hash{$_}{Float} == 0.1 && $hash{$_}{XY} eq 'X0Y0'
} keys %hash;

注意,我对字符串使用了eq,而对数字使用了==。对于浮点数,即使是==也会因为不精确而变得棘手。

票数 6
EN

Stack Overflow用户

发布于 2021-05-27 23:43:16

这里有另一种方法来实现同样的目的。

代码语言:javascript
运行
复制
#!/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实现。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67724742

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档