#!/usr/bin/perl -wT use strict; { # Create an interleaved 'AaBbCc' mapping my %map; $map{$_} = 2*(ord($_)-ord('A')) for 'A'..'Z'; $map{$_} = 2*(ord($_)-ord('a'))+1 for 'a'..'z'; # use interleaved map to munge word into a string that will sort "correctly" sub dictize { my $word = shift; $word =~ s/(\d+|[A-Za-z])/chr($map{$1}||60+$1)/ge; return $word; } } my @words = qw(bigBoy bigbang bigboy x10y x9y x11y); # Sort based on lowercased munged words, # use the non-lowercased version as a tiebreaker my @sorted = map {$_->[0]} sort {$a->[1] cmp $b->[1] or $a->[2] cmp $b->[2]} map {[$_,dictize(lc),dictize($_)]} @words; print "$_\n" for @sorted; __END__ bigbang bigBoy bigboy x9y x10y x11y