1

私は次の構造を持っています:

my @fields = (
    {
        "dbId"        => "BabysSex",
        "db2Id"       => "DetSex",
        "name"        => "Baby's Sex",
        "datatype"    => "Text",
        "outputorder" => 5,
        "value" => undef,
    },
    {
        "dbId"     => "HospitalCode",
        "name"     => "Hospital Code",
        "datatype" => "Text",
        "value" => undef,
    },
    {
        "dbId"        => "UniqueIdenifier",
        "name"        => "Unique Identifier",
        "datatype"    => "Text",
        "outputorder" => 7,
        "value" => undef,
    },

);

each に値を割り当てた後、$filed[$i]->{"value"}さらに処理と展開を行う必要があります。たとえば、私が処理しているデータ セットでは、数字を使用してさまざまな性別の値を表しています (たとえば、男性は 1、女性は 2 など)。これを for ループで展開できます。

for ( my $i = 0 ; $i < scalar @fields ; $i++ ) {
   if ( $fields[$i]->{"name"} =~ /sex/i && $fields[$i]->{"value"} )
   {
      $fields[$i]->{"value"} = $SexMap{ $fields[$i]->{"value"}};
   }
}

私が知りたいのはmap、同じ結果を得るために使用できるかどうかです。

ありがとう

4

1 に答える 1

4

はい、できますが、それが正しいとは確信していませんし、絶対に必要ではありません。

私はあなたのコードを次のように書き直すことから始めます

for (@fields) {
    $_->{value} = $SexMap{ $_->{value} } if $_->{name} =~ /sex/i and $_->{value};
}

foreachは配列内の各要素にエイリアスを設定するため、これは問題なく機能します。 $_

のような地図に変えることができます。

@fields = map {
    $_->{value} = $SexMap{ $_->{value} } if $_->{name} =~ /sex/i and $_->{value};
    $_;
} @fields;

しかし、マップは実際には何もしていないことに気付くでしょう。コードを追加しているだけです。

マップが必要な理由が、オリジナルを変更せずにコピーを作成することである場合、

@newfields = map {
    ($_->{name} =~ /sex/i and $_->{value})
    ? ( { %$_, value => $SexMap{ $_->{value} } } )
    : ( { %$_ } )
} @fields;

これは各要素の浅いコピーを行います(したがって、マップは実際に何かを達成します)が、おそらくそれを達成するためのよりクリーンな方法があります。

于 2012-08-17T01:46:08.633 に答える