如何使用Perl中的map函数获取哈希中的数组值

时间:2013-12-16 14:26:23

标签: perl map

我有一个与#结合的元素数组,我希望将其放入哈希中,该数组的第一个元素作为键,并在通过#拆分数组元素之后将其作为值 但它没有发生。

例如:

my @arr = qw(9093#AT#BP 8111#BR 7456#VD#AP 7786#WS#ER 9431#BP ) #thousand of data 

我想要的是

$hash{9093} = [AT,AP];
$hash{8111} = [BR]; and so on

我们如何使用地图功能完成它。否则我需要使用for循环,但我希望使用map函数。

5 个答案:

答案 0 :(得分:6)

my %hash = map { my ($k, @v) = split /#/; $k => \@v } @arr;

为了进行比较,相应的foreach循环如下:

my %hash;
for (@arr) {
   my ($k, @v) = split /#/;
   $hash{$k} = \@v;
}

答案 1 :(得分:5)

使用split拆分'#',将第一个块作为键,并将其余部分保留在数组中。然后使用键和对数组的引用创建一个哈希。

use Data::Dumper;

my @arr  = qw( 9093#AT#BP 8111#BR 7456#VD#AP 7786#WS#ER 9431#BP );
my %hash = map {
   my ($key, @vals) = split '#', $_;
   $key => \@vals;
} @arr;

print Dumper \%hash;

答案 2 :(得分:2)

你的问题没有显示,但我的代码被冻结,所以我会咬人:)

认为for循环在这里是更惯用的Perl,逐个处理元素,在#上拆分然后分配到你的哈希:

use strict;
use warnings; 
use Data::Dumper;

my @arr = qw(9093#AT#BP 8111#BR 7456#VD#AP 7786#WS#ER 9431#BP );
my %h;

for my $elem ( @arr ) {
   my ($key, @vals) = split /#/, $elem; 

   $h{$key} = \@vals;
}
print Dumper \%h;

答案 3 :(得分:1)

这很简单:

%s = (map {split(/#/, $_, 2)} @arr);

测试它:

$ cat 1.pl
my @arr = qw(9093#AT#BP 8111#BR 7456#VD#AP 7786#WS#ER 9431#BP );
%s = (map {split(/#/, $_, 2)} @arr);
foreach my $key ( keys %s )
{
  print "key: $key, value: $s{$key}\n";
}

$ perl 1.pl
key: 7456, value: VD#AP
key: 8111, value: BR
key: 7786, value: WS#ER
key: 9431, value: BP
key: 9093, value: AT#BP

答案 4 :(得分:1)

use strict;
use warnings; 
use Data::Dumper;

my @arr = ('9093#AT#BP', '8111#BR', '7456#VD#AP', '7786#WS#ER', '9431#BP' );
my %h = map { map { splice(@$_, 0, 1), $_ } [ split /#/ ] } @arr;
print Dumper \%h;