http://qs1969.pair.com?node_id=411403


in reply to How do I do a natural sort on an array?

I wrote the following before finding the delightful Sort::Naturally library function. I recommend using that over what I've done, but maybe people are curious how it might be done. Or maybe someone needs to fine-tune or customize it.

The following code is not efficient. In particular, the calling of naturalSortInner with $a and $b as arguments completely eliminates the efficiency of having $a and $b. However, it was necessary for the recursive nature of naturalSortInner.

#!/usr/bin/perl sub naturalSortInner { $x = uc( shift ); $y = uc( shift ); if( !($x =~ /\d+(\.\d+)?/) ) { return $x cmp $y; } $xBefore = $`; $xMatch = $&; $xAfter = $'; if( !($y =~ /\d+(\.\d+)?/) ) { return $x cmp $y; } if( $xBefore eq $` ) { if( $xMatch == $& ) { return naturalSortInner( $xAfter, $' ); } else { return $xMatch <=> $&; } } else { return $x cmp $y; } print "\n<before: '$xBefore', match: '$xMatch', after: '$xAfter'>\ +n"; } sub naturalSort { naturalSortInner( $a, $b ); } @arr = ( 'beta', 'Alpha', 'Gamma1', 'Gamma', '23', '5', 'Version1', 'Version1.1', 'Version1.2', 'Version11.1-Sub1', 'Version11.1-Sub10', 'Version11.1-Sub3', 'x23sub5', 'Version2', 'Version2.1', 'GammaGlobulin', 'Gamma10', 'c', 'Gamma2', 'Gamma3', ); print join( "\n", sort naturalSort @arr ) . "\n";