0

我有一个数组如下:

@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; 

但我得到了所有我应该得到单个数组的前两个值的值

4

4 回答 4

4

它很容易:

%hash = map {$_=>1} grep { defined $_ } map { (split /:/, $_)[0..1] } @array;

所以,你用“:”分隔符分割每个数组元素,得到更大的数组,只取 2 个第一个值;然后 grep 定义的值并将其传递给其他映射制作键值对。

于 2013-06-22T05:19:22.250 回答
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;
于 2013-06-22T05:57:18.847 回答
1

我认为这应该有效,尽管不够优雅。我使用一个临时数组来保存split并返回前两个元素的结果。

my %hash = map { $_ => 1 } map { my @t = split ':', $_; $t[0], $t[1] } @array;
于 2013-06-22T06:21:36.733 回答
1

这过滤掉g关键

my %hash = map { map { $_ => 1; } (split /:/)[0,1]; } @array;
于 2013-06-22T06:25:27.993 回答