http://www.perlmonks.org?node_id=442435


in reply to Re^2: Alpha number sort
in thread Alpha number sort

Ah. It appears that everyone (including me) missed this.

#!/usr/bin/perl -w use strict; my @list= <DATA>; my @sorted= @list[ map { unpack "N", substr($_,-4) } sort map { my $key= $list[$_]; $key =~ s[((?<!\.)(\d+)\.\d+(?!\.)|\d+)][ my $len= length( defined($2) ? $2 : $1 ); pack( "N", $len ) . $1 . ' '; ]ge; $key . pack "N", $_ } 0..$#list ]; print @sorted; __END__ a1.5 a1.5b a1.55 a1.55b a1.6 a1.6b linux-2.4.28.tar linux-2.4.29.tar linux-2.4.29a.tar linux-2.4.3.tar linux-2.10.6.tar linux-2.10.50.tar

Produces

a1.5 a1.5b a1.55 a1.55b a1.6 a1.6b linux-2.4.3.tar linux-2.4.28.tar linux-2.4.29.tar linux-2.4.29a.tar linux-2.10.6.tar linux-2.10.50.tar

Update: Third-time lucky. The original regexes are below in HTML comments.

- tye        

Replies are listed 'Best First'.
Re^4: Alpha number sort (two truer to spec)
by gam3 (Curate) on Mar 27, 2005 at 20:05 UTC
    It is always nice to see code that is smaller and faster. Two times faster an 6 times smaller.
          Rate gam3  tye
    gam3 243/s   -- -69%
    tye  772/s 218%   --
    
    The regex still had one bug: you need a \d in the backtrace to keep it from matching 2.11. on 2.1/1.
    qr/((?<!\.)(\d+)\.\d+(?![\.\d])|\d+)/
    I would never have thought of using s///g in place of my while loop.
    -- gam3
    A picture is worth a thousand words, but takes 200K.