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

Re: natural sort on array of arrays

by duelafn (Vicar)
on May 10, 2016 at 16:54 UTC ( #1162647=note: print w/replies, xml ) Need Help??

in reply to natural sort on array of arrays

Using code stolen from Re: Alpha number sort (one, true, natural sort). Like the grep/sort/grep code you have, it replaces each number with a fixed-length number-like thing that regular cmp will sort properly (the magic is in s[(\d+)][ pack "N", $1 ]ge).

my @sorted_matrix = sort { natural_cmp($a->[0], $b->[0]) } @matrix; for my $i ( 0 .. $#sorted_matrix ) { for my $j ( 0 .. $#{ $sorted_matrix[$i] } ) { print "$i $j -> $sorted_matrix[$i][$j]\n"; } print "\n"; } =head3 natural_cmp A fast, flexible, stable comparator that sorts strings naturally (that + is, numerical substrings are compared as numbers). Code lifted from tye on perlmonks: +42285 Limitations: It doesn't "properly" sort negative numbers, non-fixed decimal value +s, nor integers larger than 2^32-1. =cut sub natural_cmp { my ($x,$y) = map { my $key = $_; $key =~ s[(\d+)][ pack "N", $1 ]ge; + $key } @_; $x cmp $y; }

Which gives (showing just the sorting column):

0 0 -> A1a1 1 0 -> A1a12 2 0 -> A10a1 3 0 -> A12a1

Good Day,

Replies are listed 'Best First'.
Re^2: natural sort on array of arrays
by shamat (Acolyte) on May 10, 2016 at 17:29 UTC
    Thank you duelafn, your code works like a charm.

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://1162647]
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others scrutinizing the Monastery: (5)
As of 2021-03-01 10:08 GMT
Find Nodes?
    Voting Booth?

    No recent polls found