如何在perl中对字母数字数组进行排序?

时间:2015-04-04 07:55:22

标签: perl

我有一个名为

的字母数字数组
my @array1= (gee0,gee1,gee7,gee10,gee12,gee20,gee24,gee15,gee8,gee47);

如何对上述字母数字数组进行排序?

3 个答案:

答案 0 :(得分:2)

您可以使用$ a和$ b变量在sort命令中编写任何类型的比较代码。例如,使用字母数字比较运算符:

my @sorted_array = sort {
  $a <=> $b
} @array1;

这不适用于你拥有的字符串。如果它们都包含相同的前缀,您可以在比较之前删除它,如:

my @sorted_array = sort {
  my ($anum) = ($a =~ /\w(\d+)$/);
  my ($bnum) = ($b =~ /\w(\d+)$/);
  $anum <=> $bnum
} @array1;

当然,这将在每次比较中剥离它。如果数组很大,你想要像这样预先剥离它:

my @sorted_array =  map { 
  $_->[0]
} sort {
  $a->[1] <=> $b->[1]
} map {
  [$_,($_ =~ /(\d+)$/)]
} @array1;

这基本上创建了一个新数组,其中每个元素都是一对可排序键和原始值,在按键排序后,您将删除键并仅显示值。这种技术称为Schwartzian Transform

答案 1 :(得分:1)

Schwartzian变换的替代方法是创建要排序的变换值的新数组,对该数组的索引进行排序,并使用排序的索引重新排序原始数据作为数组切片。

喜欢这样

use strict;
use warnings;

my @array   = qw/ gee0 gee1 gee7 gee10 gee12 gee20 gee24 gee15 gee8 gee47 /;
my @values  = map /(\d+)/, @array;
my @indices = sort { $values[$a] <=> $values[$b] } 0 .. $#values;

print "$array[$_]\n" for @indices;

<强>输出

gee0
gee1
gee7
gee8
gee10
gee12
gee15
gee20
gee24
gee47

答案 2 :(得分:1)

如果您正在寻找最简单的解决方案,那就是:

use Sort::Key::Natural qw( natsort );

my @sorted = natsort @data;

如果您正在寻找最快的解决方案,那就是:

use Sort::Key::Natural qw( natsort );

my @sorted = natsort @data;