Syntactic Confectionery Delight PerlMonks

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

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

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

I'm not exactly sure what you want (it would have helped if you had provided an example) but here's what I use:
```sub byfile {
my @a = split /(\d+)/, \$a;
my @b = split /(\d+)/, \$b;
my \$M = @a > @b ? @a : @b;
my \$res = 0;
for (my \$i = 0; \$i < \$M; \$i++) {
return -1 if ! defined \$a[\$i];
return 1 if  ! defined \$b[\$i];
if (\$a[\$i] =~ /\d/) {
\$res = \$a[\$i] <=> \$b[\$i];
} else {
\$res = \$a[\$i] cmp \$b[\$i];
}
last if \$res;
}
\$res;
}
This may be more complicated than you need. Given the following:
```53 7 119 53red
red5 red6 red7 red67 red6.jpg red12.jpg
green4.jpg
blue2.jpg blue1000.jpg blue2.jpg58
it produces the following output:
```7
53
53red
119
blue2.jpg
blue2.jpg58
blue1000.jpg
green4.jpg
red5
red6
red6.jpg
red7
red12.jpg
red67
Lucs St. Louis also suggests:
``` while (defined (my \$A = shift @a) and defined (my \$B = shift @b)) {
\$res = (\$A =~ /\d/) ? \$A <=> \$B : \$A cmp \$B;
return \$res if \$res;
}
return defined \$A ? -1 : 1;
Hope this helps.

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

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: (13)
As of 2013-05-22 10:42 GMT
Sections?
Information?
Find Nodes?
Leftovers?
Voting Booth?