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

如何在perl中对字母数字数组进行排序?,perl,Perl,我有一个字母数字数组,叫做 my @array1= (gee0,gee1,gee7,gee10,gee12,gee20,gee24,gee15,gee8,gee47); 如何对上述字母数字数组进行排序?您可以使用$a和$b变量将任何类型的比较代码写入sort命令。例如,使用字母数字比较运算符: my @sorted_array = sort { $a <=> $b } @array1; my@sorted\u array=sort{ $a$b }@array1; 这将不适用

我有一个字母数字数组,叫做

my @array1= (gee0,gee1,gee7,gee10,gee12,gee20,gee24,gee15,gee8,gee47);

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

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

my @sorted_array = sort {
  $a <=> $b
} @array1;
my@sorted\u array=sort{
$a$b
}@array1;
这将不适用于您拥有的字符串。如果它们都包含相同的前缀,则可以在比较之前将其去除,如:

my @sorted_array = sort {
  my ($anum) = ($a =~ /\w(\d+)$/);
  my ($bnum) = ($b =~ /\w(\d+)$/);
  $anum <=> $bnum
} @array1;
my@sorted\u array=sort{
我的($anum)=($a=~/\w(\d+)$/);
我的($bnum)=($b=~/\w(\d+)$/);
$anum$bnum
}@array1;
当然,这将在每次比较中剥离它。如果阵列较大,则需要按如下方式对其进行预剥离:

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

这基本上创建了一个新的数组,其中每个元素都是一对可排序键和原始值,在按键对它们进行排序后,可以去掉键并只显示值。这种技术称为

施瓦茨变换的一种替代方法是创建一个新的变换值数组,对该数组的索引进行排序,并使用排序后的索引将原始数据重新排序为数组切片

它是这样落体的

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;

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

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

my @sorted = natsort @data;
use Sort::Key::Natural qw( natsort );

my @sorted = natsort @data;
如果您正在寻找最快的解决方案,它是:

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

my @sorted = natsort @data;
use Sort::Key::Natural qw( natsort );

my @sorted = natsort @data;

你期望得到什么结果?顺便说一句,你的代码错了。查看结果
perl-MData::Dumper-e'my@array1={“gee0”、gee1、gee7、gee10、gee12、gee20、gee24、gee15、gee8、gee47};打印转储程序(\@array1)
。当你甚至懒得运行一行代码并检查它是否符合你的期望时,你是否期望得到答案?谢谢你的回复…很抱歉发布了错误的代码…我已经更正了代码始终
使用严格
使用警告。你的代码仍然是错误的。谢谢你的帮助。我知道了。施瓦兹安在这种情况下做得太过火了,伊姆霍。谢谢你修复代码。我有左右阅读障碍,有时我会把东西从左到右转换。我的意思是把索引放左放右。嗯,使用ST不是会减慢速度吗?如果使用ST确实有帮助,您最好使用
map substr($,4),sort map pack('N',/(\d+/)。$,@data
谢谢您的回答。这里的“natsort”是什么意思?
natsort@data
是一个子程序调用。您知道这本质上是Schwartzian转换吗,只是用一种不同的语法和一个额外的步骤重新绘制?只需使用2[n]1维数组而不是[n,2]2维数组。然后通过索引将它们连接起来。@JiriKlouda:你知道普通的排序操作本质上是Schwartzian变换吗?它只是用另一种语法编写的,只在需要时重新计算排序函数,而不是将其与原始数据一起缓存,从而节省内存?事实并非如此。您不能将Schwartz和普通排序之间的内存需求、计算难度和步数进行同构映射,但可以将您的解决方案进行同构映射到Schwatzian变换。这就是我们在数学中比较两件事的方式@JiriKlouda:当普通的
排序和ST都创建原始数据的新排序列表,而这种技术只创建索引列表时,我不认为同构是一种有用的比较。请注意,可以创建多个这样的列表,这些列表反映按不同顺序排序的数据,而无需复制原始数组中的数据,原始数组中的每个元素都可能很大。如果您没有正确理解,我已经更改了最后的
print
语句,以便它在索引列表上迭代,而不是构建单独的数组片。您是对的,没有原始值的副本,也没有第二个和更多索引的副本,或者如果是只读原始数据,甚至磁盘上的数据,您的方法最好创建一个新的排序索引。