我有以下结构:
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
来获得相同的结果。
由于
答案 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;
执行每个元素的浅表副本(因此地图实际上完成了某些操作)但是可能有更简洁的方法来实现它。