#!/usr/bin/perl -l sub LRsort { @$a <=> @$b || do { for (1..@$a) { my $LR = $a->[-$_] =~ /^\d+(?:\.\d+)?$/ && $b->[-$_] =~ /^\d+(?:\.\d+)?$/ ? $a->[-$_] <=> $b->[-$_] : $a->[-$_] cmp $b->[-$_]; return $LR if $LR; } } } sub d { print '[',join(', ',map{"'$_'"}@$_),']' for @_ } my @list = ( ['blah', 'asdf', 'foo', 'bar'], ['two'], ['zzz', 'def', 'ghi'], ['one'], ['mmm', 'def', 'ghi'], ['qqq', 'xyz', 'aaa'], ); my @sorted = sort LRsort @list; print "strings sorted"; d @sorted; $_ = [ map { my $o; $o+= ord for split//;$o } @$_ ] for @list; print "strings numified"; d @list; my @sorted = sort LRsort @list; print "numeric"; d @sorted; _END_ strings sorted ['one'] ['two'] ['qqq', 'xyz', 'aaa'] ['mmm', 'def', 'ghi'] ['zzz', 'def', 'ghi'] ['blah', 'asdf', 'foo', 'bar'] strings numified ['407', '414', '324', '309'] ['346'] ['366', '303', '312'] ['322'] ['327', '303', '312'] ['339', '363', '291'] numeric ['322'] ['346'] ['339', '363', '291'] ['327', '303', '312'] ['366', '303', '312'] ['407', '414', '324', '309']