good chemistry is complicated,and a little bit messy -LW PerlMonks

### Re: How do I do a natural sort on an array?

by Jammerwoch (Initiate)
 on Dec 01, 2004 at 08:11 UTC ( #411403=note: print w/replies, xml ) Need Help??

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";

Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://411403]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others taking refuge in the Monastery: (2)
As of 2022-05-28 08:42 GMT
Sections?
Information?
Find Nodes?
Leftovers?
Voting Booth?
Do you prefer to work remotely?

Results (99 votes). Check out past polls.

Notices?