perl中的字符串数组排序问题

perl中的字符串数组排序问题,perl,sorting,Perl,Sorting,我正在运行下面的代码对字符串进行排序,但没有得到预期的结果 代码: use warnings; use strict; my @strArray= ("64.0.71","68.0.71","62.0.1","62.0.2","62.0.11"); my @sortedStrArray = sort { $a cmp $b } @strArray; foreach my $element (@sortedStrArray ) { print "\n$element"; } 62.0

我正在运行下面的代码对字符串进行排序,但没有得到预期的结果

代码:

use warnings;
use strict;

my @strArray= ("64.0.71","68.0.71","62.0.1","62.0.2","62.0.11");
my @sortedStrArray = sort { $a cmp $b } @strArray;

foreach my $element (@sortedStrArray ) {
    print "\n$element";
}
62.0.1
62.0.11   <--- these two
62.0.2    <---
64.0.71
68.0.71
62.0.1
62.0.2    <---
62.0.11   <---
64.0.71
68.0.71
结果:

use warnings;
use strict;

my @strArray= ("64.0.71","68.0.71","62.0.1","62.0.2","62.0.11");
my @sortedStrArray = sort { $a cmp $b } @strArray;

foreach my $element (@sortedStrArray ) {
    print "\n$element";
}
62.0.1
62.0.11   <--- these two
62.0.2    <---
64.0.71
68.0.71
62.0.1
62.0.2    <---
62.0.11   <---
64.0.71
68.0.71
62.0.1
62.0.11“1”字符0x31。“2”是字符0x32。0x31小于0x32,因此“1”在“2”之前排序。你的期望是错误的

要获得您希望获得的结果,您可以使用以下方法:

my @sortedStrArray =
   map substr($_, 3),
   sort
   map pack('CCCa*', split(/\./), $_),
   @strArray;
或者对于更广泛的输入范围:

use Sort::Key::Natural qw( natsort );
my @sortedStrArray = natsort(@strArray);

请尝试Perl模块Sort::Versions,它是为满足您的期望而设计的。
它还支持字母数字版本ID。

cmp是按字典(如字典)进行比较,而不是按数字进行比较。这意味着它将逐个字符地遍历字符串,直到出现不匹配。在“62.0.11”与“62.0.2”的情况下,字符串在“62.0”之前是相等的,然后在下一个字符处发现不匹配。由于2>1,它将“62.0.2”排序为“62.0.11”。我不知道您使用字符串的目的是什么,或者您是否可以控制字符串的格式,但是如果您将格式更改为“62.00.02”(每个段有两个数字)而不是“62.0.2”,那么它们将按您的预期进行排序。

这是randal schwartz transofm的用法:

首先,了解你想要什么:
按第一个数字、第二个数字、第三个数字排序:

让我们这样做:

use warnings;
use strict;
use Data::Dumper;
my @strArray= ("64.0.71","68.0.71","62.0.1","62.0.2","62.0.11");
my @transformedArray = map{[$_,(split(/\./,$_))]}@strArray;

=pod
  here @transformedArray have such structure: 
  $each_element_of_array: [$element_from_original_array, $firstNumber, $secondNumber, $thirdNumber];
  for example:
  $transformedArray[0] ==== ["64.0.71", 64, 0, 71];
  after that we will sort it 
  first by first number
  then: by second number
  then: by third number
=cut

my @sortedArray =  map{$_->[0]} # save only your original string.
                  sort{$a->[3]<=>$b->[3]}
                  sort{$a->[2]<=>$b->[2]}
                  sort{$a->[1]<=>$b->[1]} 
                                         @transformedArray;
print Dumper(\@sortedArray);
使用警告;
严格使用;
使用数据::转储程序;
my@strArray=(“64.0.71”、“68.0.71”、“62.0.1”、“62.0.2”、“62.0.11”);
my@transformedArray=map{[$\,(split(/\./,$)]}@strArray;
=吊舱
此处@transformedArray具有以下结构:
$each_element_of_array:[$element_from_original_array,$firstNumber,$secondNumber,$thirdNumber];
例如:
$transformedArray[0]=[“64.0.71”,64,0,71];
之后,我们将对其进行排序
第一个接第一个号码
然后:第二个数字
然后:按第三个数字
=切割
my@sortedArray=map{$\u->[0]}#只保存原始字符串。
排序{$a->[3]$b->[3]}
排序{$a->[2]$b->[2]}
排序{$a->[1]$b->[1]}
@变换阵列;
打印转储程序(\@sortedArray);

请参阅:-它们按应有的顺序进行排序。这并不能回答问题。