Here is the Guttman-Rosler Transform.

#!/usr/bin/perl use strict; use warnings; use 5.012; use List::Util qw/ shuffle /; srand(1); # to get same random 'shuffle' from run to run my @list = shuffle (qw/ Y2 A15 YABBA287 DABBA345 DOO777/, map {"E$_"} +(1..20)); say "UNSORTED"; say "@list"; my @sorted = map { my $strlength = unpack("C", substr($_, -1)); substr $_, -1 * (1 + $strlength), -1; } sort map { pack "a*Na*C", /(\D+)(\d+)/, $_, length} @list; say "SORTED"; say "@sorted";

The advantage of this sort is that it uses a simple alphabetical sort. Its is usually the fastest performing sort. The configuration here will sort any 'alpha'+'number' string, not just a single leading letter plus a number.

Update: The setup here is limited to strings of length <= 255. If the strings to be sorted are longer than that, you would have to make some changes. Also, to make the sort case insensitive, which is usually the desired outcome, the first map could be restated as:

map { pack "a*Na*C", (map {lc} /(\D+)(\d+)/), $_, length} @list;

by adding the lc operator.


In reply to Re: sort after first char of hash key by Cristoforo
in thread sort after first char of hash key by danj35

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.