在哈希数组上使用map

时间:2012-08-17 01:35:53

标签: perl map

我有以下结构:

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,
    },

);

在为每个$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来获得相同的结果。

由于

1 个答案:

答案 0 :(得分: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;

执行每个元素的浅表副本(因此地图实际上完成了某些操作)但是可能有更简洁的方法来实现它。