当部分条目包含字符时,Perl对数组进行排序

时间:2011-12-07 02:41:29

标签: perl sorting

  

可能重复:
  Using Perl, how can I sort an array using the value of a number inside each array element?

我有一个如下所示的数组:

my @arr = qw(r1.1  r10.1  r2.1   r33.1);

如何在Perl中对它们进行排序,以便产生:

  $VAR = ['r1.1',   'r2.1', 'r10.1',   'r33.1'];

3 个答案:

答案 0 :(得分:3)

您可以使用Sort::Key::Natural

use Sort::Key::Natural qw(natsort);
my @arr = qw(r1.1  r10.1  r2.1   r33.1);
my @sorted = natsort @arr;

答案 1 :(得分:2)

这是一个可行的排序子程序:

sub mySort {    
    $a =~ /^r(\d+).(\d+)$/;
    my ($a1, $a2) = ($1, $2);

    $b =~ /^r(\d+).(\d+)$/;
    my ($b1, $b2) = ($1, $2);

    return $a2 <=> $b2 if ($a1 == $b1);
    return $a1 <=> $b1;
}

要使用它,请执行以下操作:

my @sorted = sort mySort @arr;

答案 2 :(得分:1)

my @sorted =
   sort {
      my @a = $a =~ /([0-9]+)/g;
      my @b = $b =~ /([0-9]+)/g;
      return $a[0] <=> $b[0] || $a[1] <=> $b[1];
   }
   @arr;

可能更快:

my @sorted =
   map substr($_, 8),
   sort
   map pack('NNa*', /([0-9]+)\.([0-9]+)/, $_),
   @arr;