[0] [1] [0] chr1 10 [1] chr3 20 [2] chr1 30 [3] chr3 5 . . . [n] chr5 5 #### [0] [1] [0] chr1 10 [1] chr1 30 [2] chr3 5 [3] chr3 20 . . . [n] chr5 5 #### my @sortedtda; my @chrnums; my @coords; $i=0; for (@twodarray) { push @chrnums, $twodarray[$i][0]=~ (/(\d+)/); push @coords, $twodarray[$i][1]=~ (/(\d+)/); ++$i; } @sortedtda = @twodarray[ sort { $coords[$a] <=> $coords[$b] || $chrnums[$a] <=> $chrnums[$b] } 0..$#twodarray ];