在perl中使用grep和map将数组转换为哈希

在perl中使用grep和map将数组转换为哈希,perl,perl-module,Perl,Perl Module,我有一个数组,如下所示: @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 {$_=>

我有一个数组,如下所示:

@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; 
但是我得到了所有的值,我应该得到单个数组的前两个值,这很容易:

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

所以,您可以使用分隔符拆分每个数组元素,使数组变大,只取2个第一个值;然后grep定义值并将其传递给其他map makng键值对。

您必须忽略除拆分后的前两个元素之外的所有内容

使用地图

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

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

my %hash = map { $_ => 1 } map { my @t = split ':', $_; $t[0], $t[1] } @array;
这过滤掉了g键

你也想要g吗?@JasonGray:他说,“我应该得到单个数组的前两个值”@Borodin这是因为如果拆分返回大小为1的数组,切片[0..1]将返回2个元素。
my %hash = map { $_ => 1 } map { my @t = split ':', $_; $t[0], $t[1] } @array;
my %hash = map { map { $_ => 1; } (split /:/)[0,1]; } @array;