【问题标题】:Searching within Hash of Hashes在散列的散列中搜索
【发布时间】:2014-05-30 18:32:03
【问题描述】:

假设我有一个数组和一个多维散列。我想递归地查看数组中的值是否作为哈希中的键存在。有没有比这样做更好的方法如下? (示例从 Perl MavenPerl Maven 编辑)。

请注意以下几点:

  1. 在下面的例子中,只有FooBarMathematics存在于哈希%grades中;
  2. 鉴于我的实际示例大约有 7 个级别,这篇文章的主要问题是如何找到一种更有效的方法来搜索一级、二级等;
  3. 请注意,我的想法是尽量收紧搜索。最好的办法是,如果我的数组中的所有元素都可以按顺序在哈希中找到(即让@array=("FooBar","Mathematics") 查看$myhash{"FooBar"}{"Mathematics"} 的值;如果失败,请查看“FooBar”或“Mathematics”是否存在在哈希的第二级,即$myhash{"otherkeys"}{"Mathematics"}$myhash{"otherkeys"}{"FooBar"})。

例子:

#!/usr/bin/perl
use strict;
use warnings;
use Data::Dump;
my @subjectsandnames=("FooBar","ThatBar","Mathematics","Biology","Physics");
my %grades;

$grades{"FooBar"}{Mathematics}   = 12;
$grades{"FooBar"}{Literature}    = 99;
$grades{"PetiBar"}{Literature}   = 87;
$grades{"PetiBar"}{Mathematics}  = 13;
$grades{"PetiBar"}{Art}          = 93;
foreach my $name (sort keys %grades) {
    my @possible = grep defined, map { $grades{$_}} @subjectsandnames; #sees matches at first level
    dd @possible;    
    foreach my $subject (sort keys %{$grades{$name}}){
        my @possible2 = grep defined, map { $grades{$name}{$_}} @subjectsandnames; #sees matches at second level
        dd @possible2;
    }
}

【问题讨论】:

    标签: perl hash


    【解决方案1】:

    不详细了解您的数据和情况,很难给出完整的建议。

    但是,假设您只是想查看最深级别的密钥是否等于您的主题列表之一。然后递归散列的散列将是一个可能的解决方案,如下所示:

    #!/usr/bin/perl
    use strict;
    use warnings;
    use Data::Dump;
    
    my @subjectsandnames = qw(FooBar ThatBar Mathematics Biology Physics);
    
    my %grades = (
        FooBar => {
            Mathematics => 12,
            Literature  => 99,
            },
        PetiBar => {
            Literature  => 87,
            Mathematics => 13,
            Art         => 93,
            },
        );
    
    recurse_hash(\%grades);
    
    sub recurse_hash {
        my ($hashref, @keys) = @_;
    
        for my $key (sort keys %$hashref) {
            my $val = $hashref->{$key};
            if (ref $val) {
                recurse_hash($val, @keys, $key);
            } elsif (grep {$key eq $_} @subjectsandnames) {
                print "@keys $key $val\n";
            }
        }
    }
    

    输出:

    FooBar Mathematics 12
    PetiBar Mathematics 13
    

    【讨论】:

    • 感谢您的帮助!我没有详细查看您的代码(有几件事我仍然没有完全掌握),但从您的描述中我必须问以下问题:recurse_hash 是否只查看最深层次的哈希,还是它也看上层?
    • 我在我的问题中编辑了第三点,也许现在更清楚了:)
    猜你喜欢
    • 2014-07-27
    • 2016-09-19
    • 1970-01-01
    • 1970-01-01
    • 2012-12-27
    • 2014-05-19
    • 1970-01-01
    • 2012-03-12
    • 2013-03-15
    相关资源
    最近更新 更多