比如说数字格式为:
1.1.10
1.1.10.1
1.1.10.2
1.1.11
1.1.12
1.1.13
1.1.13.1
1.1.3
1.1.4
我正在寻找的输出是:
1.1.3
1.1.4
1.1.10
1.1.10.1
1.1.10.2
1.1.11
1.1.12
1.1.13
1.1.13.1
答案 0 :(得分:11)
use Sort::Key::Natural qw( natsort );
my @sorted = natsort @data;
或(没有模块)
my @sorted =
map $_->[0],
sort { $a->[1] cmp $b->[1] }
map [ $_, pack('C*', split /\./) ],
@data;
或(没有模块,速度更快,但需要数组而不是输入列表)
my @sorted =
map $data[unpack('N', $_)],
sort
map pack('NC*', $_, split /\./, $data[$_]),
0..$#data;
在pack
模板中,您可以将C
更改为n
或N
。 C
允许最多255个数字。n
允许最多65,535的数字。 N
允许数字达到40亿。
答案 1 :(得分:4)
尝试以下方法:
use Modern::Perl;
use Sort::Naturally qw{nsort};
my @numbers = nsort(qw{1.1.10 1.1.10.1 1.1.10.2 1.1.11 1.1.12 1.1.13 1.1.13.1 1.1.3});
say for @numbers;
输出:
1.1.3
1.1.10
1.1.10.1
1.1.10.2
1.1.11
1.1.12
1.1.13
1.1.13.1
希望这有帮助!
答案 2 :(得分:0)
您可能更容易理解:
sub min { $_[0] <= $_[1] ? $_[0] : $_[1] }
sub comp
{
($a1,$a2) = @_;
@a1 = @{$a1};
@a2 = @{$a2};
for (0..min(scalar @a1,scalar @a2))
{
return 1 if $a1[$_] > $a2[$_];
return -1 if $a2[$_] > $a1[$_]; #exit early if an inequality is found
}
return 0 if @a1 == @a2; #both array are equal, thus both numbers are equal
return @a1 > @a2 ? 1 : -1; #arrays are equal upto a certain point, thus longer array is 'greater'
}
@sourcearray = ('1.1.10','1.1.10.1','1.1.10.2','1.1.11','1.1.12','1.1.13','1.1.13.1','1.1.3','1.1.4');
@individual = map { [split /\./] } @sourcearray; #splits each number into arrays consisting of individual numbers
@sorted = sort {comp($a,$b)} @individual; #sort algo decides which of these two arrays are 'greater'
{
local $" = ".";
print "@{$sorted[$_]}\n" for 0..$#sorted;
}