【问题标题】:Sorting key,value pairs in a perl array data structure according to key(id)根据键(id)对perl数组数据结构中的键、值对进行排序
【发布时间】:2016-05-12 02:06:05
【问题描述】:

我正在尝试对 perl 中数组数据结构中存在的键值对进行排序。但是,当有多个条目时,我无法解决如何排序。

下面是我的代码:

  my @users = (
       {id => 1,  name => "Frank"},
       {id => 10, name => "Joe"},
       {id => 5,  name => "Paul"}
      );

我希望输出相对于 id 按升序排序:

       {id => 1,  name => "Frank"},
       {id => 5,  name => "Paul"},
       {id => 10, name => "Joe"}

以下是我的努力:

  use strict; 
  use warnings;
  use 5.010;
  my @users = 
  (
    {id => 1,  name => "Frank"},
    {id => 10, name => "Joe"},
   {id => 5,  name => "Paul"}
  );

 foreach my $name (keys %users) {

 printf "%-8s %s\n",$users{id},$users{name};
 }

任何建议都会非常有帮助。

【问题讨论】:

  • 你有@users还是%users???另外,我在您的代码中的任何地方都没有看到sort???

标签: arrays perl sorting


【解决方案1】:

您的数据规范存在冲突,但这是否满足您的需求?

use strict;
use warnings;
use 5.010;

my @users = (
    { id => 1,  name => "Frank" },
    { id => 10, name => "Joe" },
    { id => 5,  name => "Paul" },
);

for my $item ( sort { $a->{id} <=> $b->{id} } @users ) {
    printf "%-8s %s\n", $item->{id}, $item->{name};
}

输出

1        Frank
5        Paul
10       Joe

【讨论】:

    【解决方案2】:

    您似乎对 Perl Hashes 的理解有误。

    也可以使用sort

    #!/usr/bin/env perl
    
    use strict; 
    use warnings;
    use 5.010;
    my %users = 
    (
      1 => {id => 1,  name => 'Frank'},
      2 => {id => 10, name => 'Joe'  },
      3 => {id => 5,  name => 'Paul' }
    );
    
    foreach my $serial (sort {$users{$a}{id} <=> $users{$b}{id}} keys %users) 
    {
       printf "%-8s %s\n",$users{$serial}{id},$users{$serial}{name};
    }
    

    【讨论】:

      【解决方案3】:

      最简单的方法是使用List::UtilsBy 中的nsort_by 函数:

      List::UtilsBy:https://metacpan.org/pod/List::UtilsBy

      use List::UtilsBy qw( nsort_by );
      
      my @users = (
          {id => 1,  name => "Frank"},
          {id => 10, name => "Joe"},
          {id => 5,  name => "Paul"}
      );
      
      foreach my $user ( nsort_by { $_->{id} } @users ) {
          printf "%-8s %s\n" , $user->{id}, $user->{name};
      }  
      

      【讨论】:

        【解决方案4】:

        这是一个使用排序的版本:

        #! /usr/bin/perl
        use strict;
        use warnings;
        use 5.010;
        
        my @users =
        (
            { id => 1 , name => "Frank" },
            { id => 10, name => "Joe"   },
            { id => 5 , name => "Paul"  }
        );
        
        @users = sort { $a->{id} <=> $b->{id} } @users;
        
        foreach my $user ( @users ) {
            printf "%-8s %s\n" , $user->{id}, $user->{name};
        }
        

        [编辑]改为按ID排序

        【讨论】:

        • 我猜你被否决了,因为 OP 说“我希望输出根据 id 进行排序”。
        猜你喜欢
        • 1970-01-01
        • 2013-05-14
        • 2011-04-05
        • 2017-09-29
        • 1970-01-01
        • 2018-12-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多