在perl中过滤散列哈希

时间:2013-09-06 14:34:58

标签: perl hash

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

说我有像这样的哈希哈希:

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",
    },
);

看起来很傻,但无法弄清楚如何过滤结构。目标是在过滤后迭代所有的斯普林菲尔德人。

我当然做了一些研究,而我最接近的是哈希切片。 但他们似乎很可怕。

3 个答案:

答案 0 :(得分: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) };

答案 1 :(得分:4)

如果您需要通过哈希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

答案 2 :(得分:0)

for my $key (keys %HoH) {
delete $HoH{$key} if(!$HoH{$key}{town});
                    (OR)
delete $HoH{$key} if($HoH{$key}{town} !~ m/springfield/);
}

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