我有一个名为
的字母数字数组my @array1= (gee0,gee1,gee7,gee10,gee12,gee20,gee24,gee15,gee8,gee47);
如何对上述字母数字数组进行排序?
答案 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;