use strict; use warnings; use feature qw{ say }; my $intended = <<'EOF'; .,-;:!?"'`_#$%&*+/|=@\^~()<>[]{}0123456789AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz EOF chomp $intended; my $seq = 0; my %sortLU = map { $_ => sprintf q{%02d}, $seq ++ } split m{}, $intended; my %revLU = reverse %sortLU; my @list = qw{ "Hello" Abel (hello) {adieu} @adieu [goodbye] Charlie ^Charlie ~Adieu zebra 21708 baker . - ; : ! ? " ' ` _ }; push @list, q{ first}; say for map { join q{}, map { $revLU{ $_ } } unpack q{(a2)*}, $_ } sort map { join q{}, map { $sortLU{ $_ } } split m{}, $_ } @list;