Beefy Boxes and Bandwidth Generously Provided by pair Networks Frank
P is for Practical
 
PerlMonks  

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

( #411403=categorized answer: print w/ replies, xml ) Need Help??

Q&A > sorting > How do I do a natural sort on an array? 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";

Comment on Answer: How do I do a natural sort on an array?
Download Code
Log In?
Username:
Password:

What's my password?
Create A New User
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others chilling in the Monastery: (6)
As of 2014-04-19 22:57 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    April first is:







    Results (485 votes), past polls