grep in nested hash perl

sal*_*mey 3 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
                }]
Run Code Online (Sandbox Code Playgroud)

我希望我的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
                }
Run Code Online (Sandbox Code Playgroud)

但是当我像这样使用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;
Run Code Online (Sandbox Code Playgroud)

它只返回:

{"Week":["1226","1239"]}
Run Code Online (Sandbox Code Playgroud)

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

Mor*_*kus 8

当你%hash通过这种方式移交时,grepPerl将散列解释为偶数编号的键和值列表 - 导致grep {...}为每个键调用一次块,为每个值调用一次(而不是为每对调用一次)核心价值).

尝试这样的事情:

{ map { ($_ => $hash{$_} } grep { $hash{$_}->{SEV} eq $Sev_Logged } keys %hash }
Run Code Online (Sandbox Code Playgroud)

grep保持了其在这些哈希键SEV字段,你想要的东西相匹配.在map后来重建的哈希(因为在那一刻,我们只有从返回键grep),最后我们把它转换成一个散列引用.