use strict; use warnings; use Data::Dump; use Test::More; my @in = ( "2bc", "1", "12c", "12", "21", "1", "1a", "2", "2", "2", "2", "3", "35", "31", "2b", "4", "42", "5", "51", "2ac", "52", "6", "7" ); my @exp = ( "1", "2", "3", "4", "5", "6", "7", "12", "21", "31", "35","42", "51", "52", "1a", "2ac", "2b", "2bc", "12c", ); my %in; @in{@in}=(); # unique my @got = map { $_->{orig} } sort { $a->{alpha} cmp $b->{alpha} || $a->{num} <=> $b->{num} } map { /(?\d+)(?[a-z]*)/; { orig => $_, %+ } } keys %in; is_deeply(\@exp,\@got) or ddx [\@exp,\@got]; done_testing;