|
Posted by Jens Thoms Toerring on July 17, 2008, 9:04 pm
Please log in for more thread options joemacbusiness@yahoo.com wrote:
> Hi All,
> I want a subroutine that will sort a file on any given column.
> So I have a file like this:
> 300 400 500 600 700
> 33 2337483 482 78374 4567
> 10 20 30 40 50
> 1000 1001 1002 1003 1004
> 9 8 7 6 5
> And I run my numericSortCol() routine on it sorting on
> column 1 and should get this:
> 9 8 7 6 5
> 10 20 30 40 50
> 300 400 500 600 700
> 1000 1001 1002 1003 1004
> 33 2337483 482 78374 4567
> The problem is that I cannot get the bynum() to accept 2 args.
> The code will work if I hard-code the $col in bynum, and
> tweek the "problem line" a bit but that defeats the purpose of the
> "sort on column" feature.
> ######################### Here's the code I have so far:
> [joe@localhost work]$ cat test18.pl
> #!/usr/bin/perl
> my $infile = "test18.in";
> open(F,"$infile") || print "cannot open $infile $!";
> my @array = <F>;
> close(F);
> numericSortCol(1,\@array);
> sub numericSortCol {
> my $col = shift;
> my $aref = shift;
> foreach my $item (sort bynum($col,@{ $aref })){ # <<<< problem
> line??
Look again at the documentation for the sort function. It takes
either a block or a function (that itself expects two arguments)
and, as the second argument, a list to be sorted. Your use of
sort doesn't seem to fit that very well and I guess if you had
used 'use warnings;' you would have been told so...
> print "item: $item\n";
> }
> }
> sub bynum {
> my $col = shift;
> @a = split(/\s+/,$a);
> @b = split(/\s+/,$b);
> $a[$col] <=> $b[$col];
> }
The simplest solution is probaly not to use a function name when
calling sort but instead a block like this:
#!/usr/bin/perl
use strict;
use warnings;
my @array = <DATA>;
numericSortCol( 1, \@array );
sub numericSortCol {
my ( $col, $aref ) = @_;
print "item: $_"
for sort { ( split /\s+/, $a )[ $col ] <=>
( split /\s+/, $b )[ $col ] } @$aref;
}
__DATA__
300 400 500 600 700
33 2337483 482 78374 4567
10 20 30 40 50
1000 1001 1002 1003 1004
9 8 7 6 5
Regards, Jens
--
\ Jens Thoms Toerring ___ jt@toerring.de
\__________________________ http://toerring.de
|