in reply to array splitting and sorting

Do you really need to split the lines into separate arrays to sort them? That is, do you want a separate sorted list of lastnames, a sorted list of firstnames, and so on? Or do you want to sort the lines by lastname and then firstname?

If you want the latter (I'm guessing you do), all you have to do is to make a custom sort routine. You can either leave the lines as they are (to save on memory), or split them (to save time, perhaps, and to make it easier to deal with the data later). The easiest to demonstrate is probably to split them first:

my @lines; while (<>) { chomp; my @line = split(','); push(@lines, \@line); } @lines = sort { $a->[0] cmp $b->[0] or $a->[1] cmp $b->[1] or $a->[2] <=> $b->[2] or $a->[3] <=> $b->[3] or $a->[4] <=> $b->[4] } @lines; foreach my $line (@lines) { print join(",", @{$line}) . "\n"; }
Here, we read each line, strip off line endings, and then split it on comma boundaries. A reference to the resultant array is then pushed into the array @lines. Then we sort @lines using a custom sort routine that does a sort by the fields in order. This assumes that the first two fields are alphabetical, and the rest numeric. I'm assuming that height is in some rational form like cm.

Then the program just prints out the sorted lines, with commas put back in. You can fiddle with the sort routine to make it case insensitive, etc. but the basic idea still stands.

Replies are listed 'Best First'.
Re: Re: array splitting and sorting
by Anonymous Monk on Jun 01, 2001 at 08:55 UTC

    Thanks for your wisdom.

    I tried this:

    while (<FILE>){ #FILE=filehandle chomp; (@last, @first, @age, @sex, @height, @weight, @Comment) = split (/\,/) +; }

    however it did not work. I am assuming that the reason it did not work was cause I was using the string split, and tring to convert it to spliting an array.

    Thanks again for your help. I will try this out.

    A greatfull, Traineeeee.....

      Your problem is that the while iterates over each record in turn (setting it to the magical $_), thus you need to set each element of each array in turn, this is done by modifying your code thusly:

      $i = -1; while (<FILE>){ chomp; $i++; ($last[$i], $first[$i], $age[$i], $sex[$i], $height[$i], $weight[$i +]) = split/,/; } die "Sorry, no data\n" if $i == -1;

      Note you do not need the \ before the comma in your split or the parenths. Presume you have no problems with the sort, if not you can use:

      @alphabetical = sort @alphabetical # the above is equivalent to @alphabetical = sort {$a cmp $b} @alphabetical @numerical = sort {$a <=> $b} @numerical; # to reverse the sort order reverse the positions of $a and $b, or use + reverse sort @a

      Hope this helps

      Cheers

      tachyon