my @list = ( '1,cat', '2,dog', '22,mouse', '11,eel', '001,elk', '13,mink'); my %unsorted = map { split /,/ } @list ; my @sorted = map { $_.','.$unsorted{$_} } sort { $a <=> $b } keys %unsorted; #### my @list = ( 'cat,1', 'dog,2', 'mouse,22', 'eel,11', 'elk,001', 'mink,13'); my %unsorted = map { reverse split /,/ } @list ; my @sorted = map { $unsorted{$_}.','.$_ } sort { $a <=> $b } keys %unsorted; #### my @list = ( 'cat,1', 'dog,1', 'mouse,22', 'eel,22', 'elk,001', 'mink,13'); # as pointed by choroba, this can be put simpler # my %unsorted = map { $_ => [ reverse split /,/ ]->[0] } @list ; my %unsorted = map { $_ => [ split /,/ ]->[-1] } @list ; my @sorted = sort { $unsorted{$a} <=> $unsorted{$b} } keys %unsorted;