我认为我们需要清理您的排序算法。你说:
- 梯子的深度
- 根据它们的索引对它们进行排序。
这是一个例子:
$array[0] = [ qw(1 a b c d e) ];
$array[2] = [ qw(1 2 b c d e) ];
$array[3] = [ qw(a b c) ];
$array[4] = [ qw(a b c d e) ];
您希望它们以这种方式排序:
$array[3] = [ qw(a b c) ];
$array[2] = [ qw(1 2 b c d e) ];
$array[0] = [ qw(1 a b c d e) ];
$array[4] = [ qw(a b c d e) ];
那是对的吗?
那这个呢?
$array[0] = [ qw(100, 21, 15, 32) ];
$array[1] = [ qw(32, 14, 32, 20) ];
按数字排序,$array[1]
应该是 before $array[0]
,但按字符串排序,$array[0]
是 before $array[1]
。
此外,您注意到在查看数组的第二个元素之前,我无法判断$array[0]
应该在之前还是之后。$array[1]
这使得在单行函数上进行排序非常困难。即使你能以某种方式减少它,它也会让别人很难分析你在做什么,或者让你调试语句。
幸运的是,您可以将整个子例程用作排序例程:
use warnings;
use strict;
use autodie;
use feature qw(say);
use Data::Dumper;
my @array;
$array[0] = [ qw(1 2 3 4 5 6) ];
$array[1] = [ qw(1 2 3) ];
$array[2] = [ qw(a b c d e f) ];
$array[3] = [ qw(0 1 2) ];
my @sorted_array = sort sort_array @array;
say Dumper \@sorted_array;
sub sort_array {
#my $a = shift; #Array reference to an element in @array
#my $b = shift; $Array reference to an element in @array
my @a_array = @{ $a };
my @b_array = @{ $b };
#
#First sort on length of arrays
#
if ( scalar @a_array ne scalar @b_array ) {
return scalar @a_array <=> scalar @b_array;
}
#
# Arrays are the same length. Sort on first element in array that differs
#
for my $index (0..$#a_array ) {
if ( $a_array[$index] ne $b_array[$index] ) {
return $a_array[$index] cmp $b_array[$index];
}
}
#
# Both arrays are equal in size and content
#
return 0;
}
这将返回:
$VAR1 = [
[
'0',
'1',
'2'
],
[
'1',
'2',
'3'
],
[
'1',
'2',
'3',
'4',
'5',
'6'
],
[
'a',
'b',
'c',
'd',
'e',
'f'
]
];