【问题标题】:How to get array values in hash using map function in Perl如何在 Perl 中使用 map 函数获取哈希中的数组值
【发布时间】:2013-12-16 23:40:55
【问题描述】:

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

例如:

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 函数。

【问题讨论】:

  • 您应该使用use strictuse warnings 运行您的Perl 代码。例如:Possible attempt to put comments in qw() list.

标签: perl map


【解决方案1】:
my %hash = map { my ($k, @v) = split /#/; $k => \@v } @arr;

为了比较,对应的foreach循环如下:

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

【讨论】:

  • 谢谢ikegami,您的回答与tobyink类似。所以,我会选择他的答案为最佳。谢谢你们这么快的反应。
  • 如果您要将代码格式化为他的答案,那么您最好使用 foreach 循环!
  • 但是如果你们都编写了相同的代码,虽然我使用了你的代码,但只有 diff 是变量名。谢谢大家
【解决方案2】:

使用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;

【讨论】:

  • 感谢托比因克。我没有想到我们可以分配和编写一些这样的代码。做得太好了!它有帮助
【解决方案3】:

您的问题没有显示任何努力,但我正在冻结代码,所以我会咬:)

一个认为 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;

【讨论】:

    【解决方案4】:

    这很简单:

    %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
    

    【讨论】:

    • 不完全。使用9093 => 'AT#BP' 而不是9093 => [ 'AT', 'BP' ]
    【解决方案5】:
    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;
    

    【讨论】:

      猜你喜欢
      • 2010-09-08
      • 1970-01-01
      • 1970-01-01
      • 2012-12-07
      • 2016-05-25
      • 1970-01-01
      • 2021-12-30
      • 2013-02-12
      • 2015-06-26
      相关资源
      最近更新 更多