我有一个数组如下:
@array = ('a:b','c:d','e:f:g','h:j');
如何使用grep和map将其转换为以下内容?
%hash={a=>1,b=>1,c=>1,d=>1,e=>1,f=>1,h=>1,j=>1};
我试过了:
@arr;
foreach(@array){
@a = split ':' , $_;
push @arr,@a;
}
%hash = map {$_=>1} @arr;
但我得到的所有值我应该得到一个单独数组的前两个值
答案 0 :(得分:4)
非常简单:
%hash = map {$_=>1} grep { defined $_ } map { (split /:/, $_)[0..1] } @array;
所以,你用“:”分隔符拆分每个数组元素,得到更大的数组,只取2个第一个值;然后grep定义的值并将其传递给其他 map makng键值对。
答案 1 :(得分:1)
除split
,
my @arr;
foreach (@array){
@a = split ':', $_;
push @arr, @a[0,1];
}
my %hash = map {$_=>1} @arr;
使用地图,
my %hash =
map { $_ => 1 }
map { (split /:/)[0,1] }
@array;
答案 2 :(得分:1)
我认为这应该有效但不够好。我使用临时数组来保存split
的结果并返回前两个元素。
my %hash = map { $_ => 1 } map { my @t = split ':', $_; $t[0], $t[1] } @array;
答案 3 :(得分:1)
这会过滤掉g
键
my %hash = map { map { $_ => 1; } (split /:/)[0,1]; } @array;