use strict; use warnings; use 5.014; my @strings = qw{ cabin prawn eminent pail error reptile engine copy echo soap eskimo carpet elias emblem skunk cheap }; say for map { substr $_, 8 } sort { unpack( q{N}, $a ) || unpack( q{N}, $b ) ? substr( $a, 0, 8 ) cmp substr( $b, 0, 8 ) : $a cmp $b; } map { my( $type, $ord ); if ( m{r} ) { $type = 0; $ord = 0; } elsif ( m{^e} ) { $type = 1; $ord = ord substr $_, 2, 1; } else { $type = 2; $ord = 255 - ord substr $_, -1, 1; } pack q{NNa*}, $type, $ord, $_; } @strings; #### carpet error prawn reptile emblem engine echo eminent elias eskimo copy soap cheap cabin pail skunk