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"; }