Perl以特殊方式对Alpha字符进行排序

我知道这个问题可能已经被问了一百万次,但我很难过。我有一个要排序的数组。我想得到的结果是

A
B
Z
AA
BB

可用的排序例程不会以这种方式排序。我不确定是否可以做到。这是我的 perl 脚本和我正在做的排序。我错过了什么?

# header
use warnings;
use strict;
use Sort::Versions;
use Sort::Naturally 'nsort';

print "Perl Starting ... nn"; 

my @testArray = ("Z", "A", "AA", "B", "AB");

#sort1
my @sortedArray1 = sort @testArray;
print "nMethod1n";
print join("n",@sortedArray1),"n";


my @sortedArray2 = nsort @testArray;
print "nMethod2n";
print join("n",@sortedArray2),"n";


my @sortedArray3 = sort { versioncmp($a,$b) }  @testArray;
print "nMethod3n";
print join("n",@sortedArray3),"n";


print "nPerl End ... nn"; 

1;

输出:

Perl Starting ...


Method1
A
AA
AB
B
Z

Method2
A
AA
AB
B
Z

Method3
A
AA
AB
B
Z

Perl End ...

回答

我认为你想要的是按长度排序,然后按序数排序。这很容易管理:

my @sortedArray = sort {
    length $a <=> length $b ||
    $a cmp $b
} @testArray;

这与英语完全一样:根据 a 与 b 的长度排序,然后按 a 与 b 进行比较。


回答

在对字符串进行排序时,您可以先比较它们的长度,然后再回到字符串本身:

my @out = sort {length $a <=> length $b || $a cmp $b} @testArray;

或与装饰排序未装饰又名施瓦兹变换相同的事情:

my @out = map  { $_->[0] }
          sort { $a->[1] <=> $b->[1]
                          ||
                 $a->[0] cmp $b->[0]}
          map  { [$_, length] } @testArray;


以上是Perl以特殊方式对Alpha字符进行排序的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>