use Sort::Key qw(keysort); sub mknkey { my $n = shift; $n =~ s/^0+//; my $len = length $n; my $nines = int ($len / 9); my $rest = $len - 9 * $nines; ('9' x $nines) . $rest . $n; } sub mknatkey { my $nat = @_ ? shift : $_; $nat =~ s/(\d+)/mknkey($1)/ge; $nat; } my @sorted = keysort { mknatkey($_) } @data;