【问题标题】:In Perl, how can I transform an array of hashes in to an array of values?在 Perl 中,如何将散列数组转换为值数组?
【发布时间】:2012-05-16 19:18:53
【问题描述】:

我有一个哈希数组:

my @sports;
push @sports, { id=>1, name=>'Rugby' };
push @sports, { id=>2, name=>'Football' };

我想得到一个包含所有名称的数组(显示在 CGI 弹出菜单中)。我尝试使用这个 grep 语句:

my @names = grep { $_->{name} } @sports;

但它只是返回一个哈希值数组...

所以我目前正在使用循环来遍历所有值,将它们推送到另一个数组中。

有没有办法加快速度?

【问题讨论】:

    标签: arrays perl hash mapping


    【解决方案1】:

    你想要map,而不是grep

    use strict;
    use warnings;
    my @sports;
    push @sports, { id=>1, name=>'Rugby' };
    push @sports, { id=>2, name=>'Football' };
    my @names = map $_->{name}, @sports;
    print for @names;
    
    D:\temp> perl -l m.pl
    橄榄球
    足球

    但是请注意,这与速度没有任何关系,至少在很大程度上没有关系,而且速度不应该是您最关心的问题;可读性应该是它。当然,效率很重要,但不要让自己误以为代码越简洁和神秘,程序的性能就越好。事实并非如此。 To assess performance, benchmark your programs.

    【讨论】:

    • 我知道你展示了所有的步骤,但是你可以跳过临时变量@names:print map $_->{name}, @sports
    • @briandfoy - 而是:print for map $_->{name}, @sports - 否则所有运动最终都会归为一个 RugbyFootball。我在命令行中经常使用print for LIST-l,例如:perl -lwe "print for sort keys %main::"
    • 谢谢!我理解你的速度论点(在处理方面)。我想我可以更好地将其描述为“少打字”。根据我从哪里检索数据,这意味着我在不同的地方有两个循环,只是为了创建名称数组。有了地图,我可以在一个地方完成
    【解决方案2】:
    my @sports;
    push @sports, { id=>1, name=>'Rugby' };
    push @sports, { id=>2, name=>'Football' };
    foreach(@sports){
      push @names, $_->{'name'};
    }
    foreach(@names){
      print "$_\n";
    }
    

    啊,抱歉 - 重读您的帖子。 TBH,不管你怎么写,我怀疑无论如何都会在内部发生一个循环。你确定你没有试图过早地优化吗?是否存在性能问题?

    【讨论】:

      【解决方案3】:
      for my $i ( 0 .. $#sports) {  
           print "$sports[$i]{name} \n";    
      }
      

      其实你也可以使用map函数来循环遍历

      【讨论】:

        【解决方案4】:

        如果您真的像示例中那样对 @sports 的填充进行硬编码,则解决方案很简单:

        my (@sports, @names);
        push @sports, { id=>1, name=>'Rugby' };
        push @names, 'Rugby';
        push @sports, { id=>2, name=>'Football' };
        push @names, 'Football';
        

        这完全避免了第二个循环。

        【讨论】:

          猜你喜欢
          • 2015-06-12
          • 2021-03-03
          • 2021-11-23
          • 2011-08-15
          • 2011-04-16
          • 2010-12-31
          • 2016-07-18
          • 2015-07-01
          • 2014-01-16
          相关资源
          最近更新 更多