【问题标题】:Get hash keys from a multidimensional hash given partial key matches in Perl给定 Perl 中的部分键匹配,从多维散列中获取散列键
【发布时间】:2021-08-15 20:49:52
【问题描述】:

这里是新手。我正在尝试从哈希哈希中获取第一个密钥。 假设我构造了一个哈希值,如下所示:\

%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;

提前致谢。

【问题讨论】:

    标签: perl hash


    【解决方案1】:

    使用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 表示字符串,但== 表示数字。对于浮点数,即使== 也可能由于不精确而变得棘手。

    【讨论】:

    • 哈希本身不是无序的吗? “第一”在这里有意义吗?
    • 只有当它是唯一的时候才有意义:-)
    【解决方案2】:

    这是实现相同目的的另一种方法。

    #!/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 实现。

    【讨论】:

      猜你喜欢
      • 2021-11-03
      • 1970-01-01
      • 2018-12-07
      • 1970-01-01
      • 2013-05-23
      • 2015-10-11
      • 2013-01-30
      • 1970-01-01
      • 2011-12-13
      相关资源
      最近更新 更多