我的哈希看起来像这样:
$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"的每个周相对应的所有其他数据。 我怎样才能做到这一点? 任何帮助将不胜感激。
答案 0 :(得分:8)
当你将%hash
移交给grep
时,Perl会将散列解释为偶数编号的键和值列表 - 导致调用grep {...}
块每个键一次,每个值一次(而不是为每对键和值调用)。
尝试这样的事情:
{ map { ($_ => $hash{$_} } grep { $hash{$_}->{SEV} eq $Sev_Logged } keys %hash }
grep
保留SEV
字段与您想要的匹配的哈希键。 map
之后重建了一个哈希(因为那时我们只有grep
返回的键),最后我们将它转换为哈希引用。