sub dictcmp
{
my $ac = $a;
my $bc = $b;
while( 1 ) {
my @a = $ac =~ /^\s*(([A-Za-z]+)|(\d+))(.*)/;
my @b = $bc =~ /^\s*(([A-Za-z]+)|(\d+))(.*)/;
return 0 if !defined $a[0] & !defined $b[0];
return -1 if !defined $a[0];
return 1 if !defined $b[0];
my $res;
if( $a[0] =~ /\d+/ && $b[0] =~ /\d+/) {
$res = $a[0] <=> $b[0];
}
else {
$res = $a[0] cmp $b[0];
}
return $res if $res;
$ac = $a[3];
$bc = $b[3];
}
}
####
my @list = ( "x10 y", "1abc", "a10y", "x9y", " b1" );
print join "\n", sort dictcmp @list;
####
1abc
a10y
b1
x9y
x10 y