"be consistent" PerlMonks

Answer: How do I do a natural sort on an array?

by Jammerwoch (Initiate)
 on Dec 01, 2004 at 08:11 UTC Need Help??

Q&A > sorting > How do I do a natural sort on an array? - Answer contributed by Jammerwoch

I wrote the following before finding the delightful Sort::Naturally library function. I reccommend 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";

Create A New User
Chatterbox?
and all is quiet...

How do I use this? | Other CB clients
Other Users?
Others taking refuge in the Monastery: (2)
As of 2017-08-21 03:05 GMT
Sections?
Information?
Find Nodes?
Leftovers?
Voting Booth?
Who is your favorite scientist and why?

Results (317 votes). Check out past polls.

Notices?