Wise monks, how do I do a natural sort on a array of arrays? Here is my data, and what I tried so far without success:
use strict; my @matrix; $matrix[0][0] = 'A1a1'; #sort by this column $matrix[0][1] = 'img1'; $matrix[0][2] = 'x123'; $matrix[0][3] = 'y123'; $matrix[1][0] = 'A1a2'; $matrix[1][1] = 'img2'; $matrix[1][2] = 'x123'; $matrix[1][3] = 'y456'; $matrix[1][0] = 'A1a12'; $matrix[1][1] = 'img3'; $matrix[1][2] = 'x456'; $matrix[1][3] = 'y789'; $matrix[2][0] = 'A10a1'; $matrix[2][1] = 'img4'; $matrix[2][2] = 'x456'; $matrix[2][3] = 'y123'; $matrix[3][0] = 'A12a1'; $matrix[3][1] = 'img5'; $matrix[3][2] = 'x456'; $matrix[3][3] = 'y456'; my @sorted_matrix = sort {$a->[0] <=> $b->[0] || $a->[0] cmp $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"; }
prints:
0 0 -> A10a1 0 1 -> img4 0 2 -> x456 0 3 -> y123 1 0 -> A12a1 1 1 -> img5 1 2 -> x456 1 3 -> y456 2 0 -> A1a1 2 1 -> img1 2 2 -> x123 2 3 -> y123 3 0 -> A1a12 3 1 -> img3 3 2 -> x456 3 3 -> y789
Instead I would like to have:
A1a1 A1a12 A10a1 A12a1
I also tried to adapt something I found on this forum, but I don't fully understand it.
my @sorted_matrix = grep {s/(^|\D)0+(\d)/$1$2/g,1} sort {$a->[0] cmp $ +b->[0]} grep {s/(\d+)/sprintf"%06.6d",$1/ge,1} @matrix;
Thanks for sharing your wisdom!

In reply to natural sort on array of arrays by shamat

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.