# changed your array to an array of arrays: my @arr = ( [ 'ch1', 100 ], [ 'ch2', 20 ], [ 'ch1', 13 ], [ 'ch2', 45 ], [ 'ch1', 1 ] ); # sort by chromosome then by position: my @sorted = sort { $a->[0] cmp $b->[0] or $a->[1] <=> $b->[1] } @arr; use Data::Printer; p @sorted; __END__ [ [0] [ [0] "ch1", [1] 1 ], [1] [ [0] "ch1", [1] 13 ], [2] [ [0] "ch1", [1] 100 ], [3] [ [0] "ch2", [1] 20 ], [4] [ [0] "ch2", [1] 45 ] ]