From: Eric Amick on
On Thu, 11 Aug 2005 21:38:20 GMT, Pietro <nobody(a)nowhere.no> wrote:

>Hallo, I made a little script that sort the lines of a file:
>
>#! /usr/bin/perl
>
>sub numerically {$a <=> $b;}
>
>@array = <>;
>
>@array = sort numerically (@array);
>
>print (@array);
>
>Maybe the code is not so good, but why if I give thi input file:
>
>1.3.5.6
>1.1.2.4
>111.222.444.555
>1.2.5.6
>11.22.44.55
>1.2.3.4
>11.23.66.77
>11.22.33.44
>111.222.333.444
>11.22.44.55
>111.223.333.444
>11.22.33.44
>1.2.3.4
>11.22.22.22
>11.22.55.66
>1.2.4.5
>111.222.555.666
>1.1.2.3
>1.3.4.5
>
>The result is this:
>
>1.1.2.4
>1.1.2.3
>1.2.5.6
>1.2.3.4
>1.2.3.4
>1.2.4.5
>1.3.5.6
>1.3.4.5
>11.22.44.55
>11.22.33.44
>11.22.44.55
>11.22.33.44
>11.22.22.22
>11.22.55.66
>11.23.66.77
>111.222.444.555
>111.222.333.444
>111.222.555.666
>111.223.333.444
>
>As I see perl sots only the first two field delimited by a ".", the others
>are inserted as a fifo, first line encountered first line wrote in output,
>why doesn't perl compare all the line?

Because you told it to compare numbers, and numbers have at most one
decimal point. If your goal is to compare the delimited fields, use a
function like this:

sub compare {
my @value1 = split /\./, $a;
my @value2 = split /\./, $b;
($value1[0] <=> $value2[0]) ||
($value1[1] <=> $value2[1]) ||
($value1[2] <=> $value2[2]) ||
($value1[3] <=> $value2[3]);
}

--
Eric Amick
Columbia, MD
From: Pietro on
On Thu, 11 Aug 2005 21:52:53 -0400, Eric Amick wrote:

> Because you told it to compare numbers, and numbers have at most one
> decimal point. If your goal is to compare the delimited fields, use a
> function like this:
>
> sub compare {
> my @value1 = split /\./, $a;
> my @value2 = split /\./, $b;
> ($value1[0] <=> $value2[0]) ||
> ($value1[1] <=> $value2[1]) ||
> ($value1[2] <=> $value2[2]) ||
> ($value1[3] <=> $value2[3]);
> }

Thanks to all, now I have understood (above all I did not use -w).

Bye, Pietro.
--
I will build myself a copper tower
With four ways out and no way in
But mine the glory, mine the power
(So I chose AmigaOS and GNU/Linux)

From: J. Gleixner on
Pietro wrote:

> Thanks to all, now I have understood (above all I did not use -w).

If it's IP addresses that you're trying to sort, use the already
provided, and very fast, sort_by_ip_address method from Net::Netmask:

If it's not IP addresses, and your data just happened to look like it,
then, nevermind. :-)