我在代码下面运行以对字符串进行排序而不是获得预期的结果。
代码:
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
答案 0 :(得分:9)
&#34; 1&#34;字符0x31。 &#34; 2&#34;是字符0x32。 0x31小于0x32,所以&#34; 1&#34;在&#34; 2&#34;之前排序。你的期望是错误的。
要获得您想要获得的结果,您可以使用以下内容:
my @sortedStrArray =
map substr($_, 3),
sort
map pack('CCCa*', split(/\./), $_),
@strArray;
或者更广泛的输入:
use Sort::Key::Natural qw( natsort );
my @sortedStrArray = natsort(@strArray);
答案 1 :(得分:1)
cmp正在按字典顺序(比如字典)进行比较,而不是数字。这意味着它会逐个字符地逐字逐句,直到出现不匹配的情况。在“62.0.11”与“62.0.2”的情况下,字符串相等,直到“62.0”。然后它找到下一个字符的不匹配。由于2> 1,它排序“62.0.2”&gt; “62.0.11”。我不知道你在使用你的字符串是什么,或者如果你可以控制它们的格式,但是如果要将格式更改为“62.00.02”(每个段有2位数)而不是“62.0” .2“然后他们会按照你的预期排序。
答案 2 :(得分:0)
答案 3 :(得分:0)
这是使用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);