7

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

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

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 的所有人进行迭代。

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

4

3 回答 3

11

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

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) };
于 2013-09-06T14:56:02.817 回答
4

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

use List::Pairwise qw(grepp);
%HoH = grepp { $b->{town} eq 'springfield' } %HoH; # $a is the current key, $b is the current value
于 2013-09-06T16:42:22.993 回答
0
for my $key (keys %HoH) {
delete $HoH{$key} if(!$HoH{$key}{town});
                    (OR)
delete $HoH{$key} if($HoH{$key}{town} !~ m/springfield/);
}

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

于 2014-10-01T13:37:05.370 回答