in reply to unxpected sort warnings while using sort

If your data exists in a file as a single line of unsigned integers, then you need to extract these integers (digit groups) from the line to a list or array, perhaps after chomp-ing the line (although that may not be necessary if the line is just digits and whitespace with a newline at the end), and then numerically sort the list/array using the  <=> comparator.

c:\@Work\Perl\monks>perl -wMstrict -MData::Dump -le "my $line = '2 3 3 3 5 7 8 12 32 44 55 12 3 23 43 33 1 4 25 43 42 1'; dd $line; ;; my @raw_numbers = $line =~ m{ \d+ }xmsg; ;; my @sorted_numbers = sort { $a <=> $b } @raw_numbers; dd \@sorted_numbers; " "2 3 3 3 5 7 8 12 32 44 55 12 3 23 43 33 1 4 25 43 42 1" [1, 1, 2, 3, 3, 3, 3, 4, 5, 7, 8, 12, 12, 23, 25, 32, 33, 42, 43, 43, +44, 55]
But again, what is your input data really like? You can see this with something like Data::Dumper::Dumper(), which should be available in any Perl installation, or Data::Dump::dd(), which I like, or even with individual print statements.


Give a man a fish:  <%-(-(-(-<

Replies are listed 'Best First'.
Re^2: unxpected sort warnings while using sort
by perlynewby (Scribe) on Jul 23, 2015 at 20:35 UTC

    I think you got the issue corrected for me...it is the input data that was constructed (by me and Unknowingly thought it'd be used as numbers and not string) as a string.

    2 3 3 3 5 7 8 12 32 44 55 12 3 23 43 33 1 4 25 43 42 1

      To be fair, Perl will usually just "do the right thing" for you with numbers inside strings.

      But it can only read your mind so far. See:

      my $var1 = "12345"; my $res1 = $var1 + 1; print "Result 1: [$res1]\n";

      Results in:

      Result 1: [12346]

      However:

      my $var2 = "1 2 3 4 5"; my $res2 = $var2 + 1; print "Result 2: [$res2]\n";

      Results in:

      Result 2: [2]

      You see how Perl took the first number in the line and added 1 to it? But the rest of the line has been ignored, and thrown away.

      If you want the rest of the numbers used, as noted throughout this thread, you have two choices:

      1. Process them in a way that uses them, such as the use of split, or;
      2. Put them on separate lines so file reading gets them separately.