0

我想获取嵌套哈希的键列表,其后续键是

  1. 不等于 2 或
  2. 这些键不属于我的预定义键。

在下面的示例中,所需的输出是“ person_2”、“ person_3”和“ person_4”,因为它们没有正好 2 个键,或者这些键不是来自我预定义的键:

#!/usr/bin/perl -w
use strict;
use Data::Dumper;

my @array = qw/place name/;
my %seen; 
$seen{$_}++ for @array;

my $hash = {
    person_1    => {
        name    => "name_1",
        place   => "place_1",
    },
    person_2    => {
        name    => "name_2",
        place   => "place_2",
        address => "address_2",
    },
    person_3    => {
        name    => "name_1",
    },
    person_4    => {
        who     => "name_1",
        where   => "place_1",
    },
};

foreach my $a (keys %$hash)
{
    print $a."\n" if (scalar(keys %{$hash->{$a}}) ne scalar(@array));
    foreach $b (keys %{$hash->{a}})
    {
        print $a."\n" unless $seen{$b};
    }
}

输出

person_2
person_3

上面的输出是好的person_2person_3因为它们没有确切的 2 个键

但是,我的第二个for循环逻辑也应该打印出来person_4,因为尽管它有确切的 2 个键,但这些键不是来自我的预定义键@array

你能告诉我我在这里做错了什么吗?

-谢谢。

4

2 回答 2

3

你犯了一个错误:

foreach $b (keys %{$hash->{a}})

应该

foreach $b (keys %{$hash->{$a}})
#   note the $ sign here __^

怎么样:

foreach my $a (keys %$hash) {
    print $a,"\n" if (scalar(keys %{$hash->{$a}}) ne scalar(@array));
    my $found = 0;
    foreach $b (keys %{$hash->{$a}}) {
        $found++ if exists $seen{$b};
    }
    print "$a\n" unless $found;
}
于 2013-08-20T09:08:44.747 回答
1

您可能打算使用keys %{$hash->{$a}}而不是keys %{$hash->{a}}. 由于没有'a'密钥,第二个for循环永远不会启动。

一些一般性建议:

  • 避免使用$aand$b作为变量名,因为它们会逃避严格检查(在你的情况下,$b应该是my $b
于 2013-08-20T09:23:16.473 回答