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 回答