我有一个与#结合的元素数组,我希望将其放入哈希中,该数组的第一个元素作为键,并在通过#拆分数组元素之后将其作为值 但它没有发生。
例如:
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函数。
答案 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;