in reply to Numeric Sort for Stringified Value (How to Avoid Warning)

How about this:
perl -w -MData::Dumper -e ' @old = ( "10.5 AA", "9 AC", "2 BB"); @new = sort {($b =~ /(\d+)/)[0] <=> ($a =~ /(\d+)/)[0]} @old; print Dumper \@new; '
Hope that helps.

Regards,
Edward

Replies are listed 'Best First'.
Re^2: Numeric Sort for Stringified Value (How to Avoid Warning)
by pg (Canon) on Sep 16, 2005 at 02:57 UTC
    Your code:
    perl -w -MData::Dumper -e ' @old = ( "10.5 AA", "9 AC", "2 BB"); @new = sort {($b =~ /(\d+)/)[0] <=> ($a =~ /(\d+)/)[0]} @old; print Dumper \@new;

    Your code is buggy as it only supports integer, what about this set of data:

    use Data::Dumper; @old = ( "10.5 AA", "10.6 AA", "9 AC", "2 BB"); @new = sort {($b =~ /(\d+)/)[0] <=> ($a =~ /(\d+)/)[0]} @old; print Dumper \@new;

    Your code returns

    $VAR1 = [ '10.5 AA', '10.6 AA', '9 AC', '2 BB' ];

    Which is wrong. Perl already does what your code is supposed to do (if it is implemented correctly). Thus your code has performance implication, as it is doing more than needed. In this particular case, I would rather trun off the warnings temperarily:

    use Data::Dumper; use strict; use warnings; my @old = ( "10.5 AA", "10.6 AA", "9 AC", "2 BB"); my @new; { no warnings; @new = sort {$b <=> $a} @old; } "a" == "a"; #meaingless other than to demo the fact that the warnings +is back on print Dumper \@new;