Here is my version. I *think* it should work for
all cases. I'll break it down if anyone is curious.
@sorted =
map { $_->[0] }
sort {
$x=1;
while (defined $a->[1][$x]) {
defined $b->[1][$x] or return -1;
if ($x%2) { ## Strict numeric comparison
return 1 if $a->[1][$x] > $b->[1][$x];
return -1 if $a->[1][$x] < $b->[1][$x];
}
else { ## Non-numeric comparison
return 1 if $a->[1][$x] gt $b->[1][$x];
return -1 if $a->[1][$x] lt $b->[1][$x];
}
$x++;
}
return defined $b->[1][$x] ? 1 : 0;
}
map { [$_, [split(/(\d+)/, $_)]] }
@unsorted;