【问题标题】:Filtering a hash of hash in perl在 perl 中过滤散列的散列
【发布时间】:2013-09-10 16:53:04
【问题描述】:

我有一个需要过滤的哈希值。我确实找到了如何进行查找,但它没有回答我的问题。

假设我有一个这样的哈希值:

my %HoH = (
    flintstones => {
        husband   => "fred",
        pal       => "barney",
        town      => "springfield"
    },
    jetsons => {
        husband   => "george",
        wife      => "jane",
        "his boy" => "elroy",
    },
    simpsons => {
        husband   => "homer",
        wife      => "marge",
        kid       => "bart",
        town      => "springfield",
    },
);

我可以说我想要斯普林菲尔德的所有城镇居民。我希望在没有外人的情况下输出相同的哈希值。

my %HoH = (
    flintstones => {
        husband   => "fred",
        pal       => "barney",
        town      => "springfield"
    },
    simpsons => {
        husband   => "homer",
        wife      => "marge",
        kid       => "bart",
        town      => "springfield",
    },
);

看起来很傻,但不知道如何过滤结构。目标是在过滤后对 springfield 的所有人进行迭代。

我当然做了一些研究,我得到的最接近的东西是哈希切片。 但它们看起来很吓人。

【问题讨论】:

    标签: perl hash


    【解决方案1】:

    您首先需要找到要删除的元素的键:

    grep { $HoH{$_}{town} eq 'springfield' } keys(%HoH)
    

    然后你删除它们:

    delete $HoH{$_} for grep { $HoH{$_}{town} eq 'springfield' } keys(%HoH);
    

    或者使用哈希切片:

    delete @HoH{ grep { $HoH{$_}{town} eq 'springfield' } keys(%HoH) };
    

    【讨论】:

    • grep 中,您将字符串 (keys %HoH) 视为 hashrefs。
    • @ThisSuitIsBlackNot,已修复。
    • 一如既往,比我正在研究的解决方案更干净、更优雅。我想你可以在睡梦中写下这些东西。
    • 我得到的 var 是一个引用,所以该行变为: delete $HoH->{$_} for grep { $HoH->{$_}{town} eq 'springfield' } keys( %{$HoH})
    • 是的。它被称为“语句修饰符”。记录在perlsyn
    【解决方案2】:

    如果您需要通过哈希值grepmap,那么您可以考虑使用List::Pairwise 中的greppmapp。优点是在 grep/map 代码块中不再需要提及原始哈希变量,使其更具“功能性”。所以你的问题可以这样解决:

    use List::Pairwise qw(grepp);
    %HoH = grepp { $b->{town} eq 'springfield' } %HoH; # $a is the current key, $b is the current value
    

    【讨论】:

      【解决方案3】:
      for my $key (keys %HoH) {
      delete $HoH{$key} if(!$HoH{$key}{town});
                          (OR)
      delete $HoH{$key} if($HoH{$key}{town} !~ m/springfield/);
      }
      

      使用任何一种删除选项您都会得到答案...

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-07-19
        • 1970-01-01
        • 2011-03-13
        • 2014-10-23
        • 1970-01-01
        • 2013-03-14
        • 2019-01-13
        相关资源
        最近更新 更多