Anirban Adhikary wrote:
> Dear list
> I want to sort a file which contains the following data.
> 
> SUDIP,PQR,OFFICER,15000
> DIPAK,ABC,CLERK,7500
> CHANDAN,MNP,MANAGER,12000
> WASIM,PQR,CLERK,12000
> PROTIK,XYZ,MANAGER,14000
> DIPAK,XYZ,ADMIN,17000
> 
> 
> now I have written a program which will sort the file based on column 1,
> column 2 and column 3
> 
> use strict;
> use warnings;
> my $fname="/USERS/anadhikary/test_prog/sort.txt";
> open my $DATA,'<',$fname;
> my @a = map { [ split "," ] } <$DATA>;
> close($DATA);
> 
> print map { join ",", @$_ } sort {
>        $a->[0] cmp $b->[0] or
>        $a->[1] cmp $b->[1] or
>        $a->[2] cmp $b->[2]
> } @a;
> 
> This program works fine. But my question is the columns on which I am
> sorting is hard coded. But I want to make the program dynamic.
> This file has 4 columns but It can always happen that file has 15 columns
> and I need to sort on 8 columns among the 15 columns.
> Suppose the user who runs the program is passing the number of column names
> as an program argument (for example ./sort.pl 4 5 7 8 12 13 15).
> 
> So this condition how can be implemented through this program?
> 
> I have tried in the following way
> [anadhik...@strawberry test_prog]$ ./sort.pl 1 2 3
> the code is as follows(changed part)
> 
> 
> for(my $i=0;$i<=$#ARGV;$i++){
>         my $val=$ARGV[$i];
>         $str_name.="\$a->[".$val."] cmp \$b->[".$val."] or"."\n";;
>     }
>   $str_name=substr($str_name,0,-3);
> 
> print map { join ",", @$_ } sort {
>     "$str_name"
> }...@a;
> 
> ## the $str_name prints#####
> $a->[1] cmp $b->[1] or
> $a->[2] cmp $b->[2] or
> $a->[3] cmp $b->[3]
> ########################
>  But when I run the program this gives following error
> 
> Sort subroutine didn't return a numeric value at test1.pl line 28
> 
> Please Suggest....................

This will do what you reguire. I hope it helps.

Rob



print
  map { join ',', @$_ }
  sort {
    my $cmp = 0;
    foreach (@ARGV) {
      my $i = $_ - 1;
      last if $cmp= $a->[$i] cmp $b->[$i];
    }
    $cmp;
  }
  map { [ split /,/ ] } <$DATA>;

-- 
To unsubscribe, e-mail: beginners-unsubscr...@perl.org
For additional commands, e-mail: beginners-h...@perl.org
http://learn.perl.org/


Reply via email to