c:\@Work\Perl\monks>perl -wMstrict -le "my %xlation = qw( one 1 two 2 three 3 four 4 five 5 six 6 seven 7 eight 8 nine 9 ten 10 thirty 30 thirtyone 31 thirtytwo 32 ); ;; my %chapters = ( 'Chapter One' => 'There were lots of monkeys ...', 'Chapter Nine' => 'This chapter has probably 1000 words.', 'Chapter two' => 'Here is the text in the second chapter...', 'Chapter Thirty-one' => 'Every chapter is of differing length.', 'Chapter Five' => qq{A chapter can have\nlots and lots\nof lines.}, ); ;; my @ordered_chapters = map undecorate($_), sort map decorate($_), keys %chapters ; ;; my @book = map qq{-: $_ :-\n$chapters{$_}}, @ordered_chapters; ;; print for @book; ;; exit; ;; ;; sub decorate { my ($chapter) = @_; ;; my $rx_c_num = qr{ [[:alpha:]] [-[:alpha:]]+ [[:alpha:]] }xms; ;; my ($n_chapt) = $chapter =~ m{ \A Chapter \s+ ($rx_c_num) \z }xmso or die qq{malformed chapter: '$chapter'}; ;; $n_chapt = normalize_n_chapt($n_chapt); ;; exists $xlation{$n_chapt} or die qq{unnumbered: '$chapter'}; ;; return pack 'n a*', $xlation{$n_chapt}, $chapter; } ;; sub undecorate { return unpack 'x[n] a*', $_[0]; } ;; sub normalize_n_chapt { my ($n_chapt) = @_; ;; $n_chapt =~ s{ - }{}xmsg; return lc $n_chapt; } " -: Chapter One :- There were lots of monkeys ... -: Chapter two :- Here is the text in the second chapter... -: Chapter Five :- A chapter can have lots and lots of lines. -: Chapter Nine :- This chapter has probably 1000 words. -: Chapter Thirty-one :- Every chapter is of differing length.