3

私のハッシュは次のようになります:

$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"を含む検出された各週に対応する他のすべてのデータを返すようにします。これどうやってするの?どんな助けでも大歓迎です。

4

1 に答える 1

9

%hashその方法を渡すとgrep、Perlはハッシュをキーと値の偶数のリストとして解釈します。その結果、grep {...}ブロックはキーごとに1回、値ごとに1回呼び出されます(キーと値)。

次のようなものを試してください。

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

は、フィールドが必要なものと一致grepするハッシュキーを保持します。SEVその後map、ハッシュを再構築し(その時点では、から返されたキーのみがあるためgrep)、最後にハッシュ参照に変換します。

于 2012-11-21T15:49:14.603 に答える