use strict;
my @matrix;
$matrix[0][0] = 'A1a1'; #sort by this column
$matrix[0][1] = 'img1';
$matrix[0][2] = 'x123';
$matrix[0][3] = 'y123';
$matrix[1][0] = 'A1a2';
$matrix[1][1] = 'img2';
$matrix[1][2] = 'x123';
$matrix[1][3] = 'y456';
$matrix[1][0] = 'A1a12';
$matrix[1][1] = 'img3';
$matrix[1][2] = 'x456';
$matrix[1][3] = 'y789';
$matrix[2][0] = 'A10a1';
$matrix[2][1] = 'img4';
$matrix[2][2] = 'x456';
$matrix[2][3] = 'y123';
$matrix[3][0] = 'A12a1';
$matrix[3][1] = 'img5';
$matrix[3][2] = 'x456';
$matrix[3][3] = 'y456';
my @sorted_matrix = sort {$a->[0] <=> $b->[0] || $a->[0] cmp $b->[0] } @matrix;
for my $i ( 0 .. $#sorted_matrix ) {
for my $j ( 0 .. $#{ $sorted_matrix[$i] } ) {
print "$i $j -> $sorted_matrix[$i][$j]\n";
}
print "\n";
}
####
0 0 -> A10a1
0 1 -> img4
0 2 -> x456
0 3 -> y123
1 0 -> A12a1
1 1 -> img5
1 2 -> x456
1 3 -> y456
2 0 -> A1a1
2 1 -> img1
2 2 -> x123
2 3 -> y123
3 0 -> A1a12
3 1 -> img3
3 2 -> x456
3 3 -> y789
####
A1a1
A1a12
A10a1
A12a1
####
my @sorted_matrix = grep {s/(^|\D)0+(\d)/$1$2/g,1} sort {$a->[0] cmp $b->[0]} grep {s/(\d+)/sprintf"%06.6d",$1/ge,1} @matrix;