grep in nested hash perl

时间:2012-11-21 15:43:48

标签: perl grep

我的哈希看起来像这样:

$VAR1 = {
      '1238' => {
                  'OUT3FA_5' => 65,
                  'SEV' => '3_major',
                  'OUT3A_5' => 20,
                  'OUT3-Fix' => 45,
                  'IN1' => 85
                },
      '1226' => {
                  'OUT3FA_5' => 30,
                  'SEV' => '4_minor',
                  'OUT3A_5' => 5,
                  'OUT3-Fix' => 25,
                  'IN1' => 40
                },
      '1239' => {
                  'OUT3FA_5' => 56,
                  'SEV' => '4_minor',
                  'OUT3A_5' => 34,
                  'OUT3-Fix' => 22,
                  'IN1' => 94
                }]

我希望我的Perl脚本只返回对应于" SEV"的值。 =" 4_minor"在这种情况下,它将返回:

    '1226' => {
                  'OUT3FA_5' => 30,
                  'SEV' => '4_minor',
                  'OUT3A_5' => 5,
                  'OUT3-Fix' => 25,
                  'IN1' => 40
                },
      '1239' => {
                  'OUT3FA_5' => 56,
                  'SEV' => '4_minor',
                  'OUT3A_5' => 34,
                  'OUT3-Fix' => 22,
                  'IN1' => 94
                }

但是当我像这样使用grep时:

my $Sev_Logged = "4_minor";
my $node_hash = {
Week => [
  grep {  $hash{$_}{'SEV'} eq $Sev_Logged } %hash,
   ]
    };

# Print in json format
my $json = encode_json \%$node_hash;
print $json;

它只返回:

{"Week":["1226","1239"]}

我希望它返回与包含SEV =" 4_minor"的每个周相对应的所有其他数据。 我怎样才能做到这一点? 任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:8)

当你将%hash移交给grep时,Perl会将散列解释为偶数编号的键和值列表 - 导致调用grep {...}块每个键一次,每个值一次(而不是为每对键和值调用)。

尝试这样的事情:

{ map { ($_ => $hash{$_} } grep { $hash{$_}->{SEV} eq $Sev_Logged } keys %hash }

grep保留SEV字段与您想要的匹配的哈希键。 map之后重建了一个哈希(因为那时我们只有grep返回的键),最后我们将它转​​换为哈希引用。