根据给定的键顺序排序

时间:2013-10-28 19:21:42

标签: perl

给定一个包含顺序的数组

  

my $ ord =(“USA”,“IN”,“AUS”,“NZ”,“NEP”,“CHN”,“ARG”,“UK”);

另外,我们给出了哈希:

my %hash = ("IN" => 'val1', "AUS" => 'val2', 
            "USA" => 'val3',   "UK" => 'val4',
             "CHN"=>'val5',"UK"=>'val6',
              "NZ"='val7',"IN"=>'val8',
               "NEP"=>'val9',ARG=>'val10',
                 "IN"=>'val11'); 

我们必须根据$ ord的顺序对密钥进行排序。

即排序后,输出应为:

"USA"=>'val3'
"IN"=>'val1'
"IN"=>'val8'
"IN"=>'val11'
........
.......
"UK"=>'val4'

在perl中有一种简单的方法吗?或者,我是否需要自己编写这样的功能?

1 个答案:

答案 0 :(得分:3)

您的哈希不可能包含具有相同键的两个(或三个)元素。最好创建一个数组哈希。

my @data = (
   IN  => 'val1',
   AUS => 'val2', 
   USA => 'val3',
   UK  => 'val4',
   CHN => 'val5',
   UK  => 'val6',
   NZ  => 'val7',
   IN  => 'val8',
   NEP => 'val9',
   ARG => 'val10',
   IN  => 'val11',
); 

my @order = qw( USA IN AUS NZ NEP CHN ARG UK );

my %vals_by_country;
while (@data) {
   my $country = shift(@data);
   my $val     = shift(@data);

   push @{ $vals_by_country{$country} }, $val;
}

for my $country (@order) {
   if (my $vals = $vals_by_country{$country}) {
      for my $val (@$vals) {
         print("$country: $val\n");
      }
   }
}
相关问题