|
Prev: Compiling Perl modules on AIX using gcc instead of cc_r?
Next: beginner question on using the Win32::OLE module
From: Eric Amick on 11 Aug 2005 21:52 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 12 Aug 2005 01:54 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 12 Aug 2005 13:09
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. :-) |