in reply to numeric sort on substring

The issue with your regular expression is that you are capturing the first number, not the second, into your buffer. You could get your expected result modifying your regular expression to not capture the first digits:

#!/usr/bin/perl use strict; use warnings; my @data = grep $_, <DATA>; print sort RowSort @data; sub RowSort { my($aa) = $a =~ /\d+,(\d+)/; my($bb) = $b =~ /\d+,(\d+)/; $aa <=> $bb; } __DATA__ 1,64,1.4.5,1.4.6,44642850,44642850,0,27348,10028,59188,1488095,761904. +64 1,128,1.4.5,1.4.6,25337850,25337850,0,19236,10276,28196,844595,864865. +28 1,256,1.4.5,1.4.6,13489200,13489200,0,17792,11372,17832,449640,920862. +72 1,512,1.4.5,1.4.6,6996270,6996270,0,18084,16744,19124,233209,955224.06 +4 1,1024,1.4.5,1.4.6,3557880,3557880,0,31528,20488,35188,118596,971538.4 +32 2,64,1.4.5,1.4.6,44642850,44642850,0,25828,9548,40128,1488095,761904.6 +4 2,128,1.4.5,1.4.6,25337850,25337850,0,27936,10796,28696,844595,864865. +28 2,256,1.4.5,1.4.6,13489200,13489200,0,12852,10692,13332,449640,920862. +72 2,512,1.4.5,1.4.6,6996270,6996270,0,17184,15904,18844,233209,955224.06 +4 2,1024,1.4.5,1.4.6,3557880,3557880,0,34068,17948,36628,118596,971538.4 +32

Using YAPE::Regex::Explain to parse the regex:

The regular expression: (?-imsx:\d+,(\d+)) matches as follows: NODE EXPLANATION ---------------------------------------------------------------------- (?-imsx: group, but do not capture (case-sensitive) (with ^ and $ matching normally) (with . not matching \n) (matching whitespace and # normally): ---------------------------------------------------------------------- \d+ digits (0-9) (1 or more times (matching the most amount possible)) ---------------------------------------------------------------------- , ',' ---------------------------------------------------------------------- ( group and capture to \1: ---------------------------------------------------------------------- \d+ digits (0-9) (1 or more times (matching the most amount possible)) ---------------------------------------------------------------------- ) end of \1 ---------------------------------------------------------------------- ) end of grouping ----------------------------------------------------------------------

See perlretut.

Replies are listed 'Best First'.
Re^2: numeric sort on substring
by mikeraz (Friar) on Jan 06, 2011 at 17:40 UTC

    Or do you need:

    sub RowSort { my ($a1, $a2) = $a =~ /(\d+)\,(\d+)/; my ($b2, $b2) = $b =~ /(\d+)\,(\d+)/; my $am = $a1.$a2; my $bm = $b1.$b2; $am <=> $bm; }


    Be Appropriate && Follow Your Curiosity