在Perl中过滤哈希表中的哈希表

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

看起来很傻,但是我不知道如何筛选结构。目标是在筛选后迭代所有斯普林菲尔德的人。

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

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

1
grep 中,您将字符串 (keys %HoH) 视为哈希引用。 - ThisSuitIsBlackNot
2
一如既往,比我正在处理的解决方案更加简洁和优雅。我想你可以轻松地在睡梦中编写这些代码。 - ThisSuitIsBlackNot
我得到的变量是一个引用,所以这行代码变成了:delete $HoH->{$} for grep { $HoH->{$}{town} eq 'springfield' } keys(%{$HoH})。 - rakwatt
这个语法是什么意思?我能不能像这样为('test1', 'test2')打印$_? - rakwatt
1
是的。它被称为“语句修饰符”。在perlsyn文档中有详细说明。 - ikegami

4

如果你需要在哈希表中使用 grepmap,那么可以考虑使用来自List::Pairwisegreppmapp。其优点在于在 grep/map 代码块中不再需要提及原始哈希变量,使其更具“功能性”。因此,你可以像这样解决问题:

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

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接