in reply to Re: Re: Sorting numbers (not)
in thread Sorting numbers

You don't understand how sort works.

You should know that sort expects a list (an array) to sort. Not just one element. When you call a subroutine to "sort everything in $start_bit_no", you will sort a scalar, i.e. JUST ONE NUMBER (or string).

And you made a mistake in your assignments:

$start_bit_no = @column1[3]; #don't use this when you mean $start_bit_no = $column1[3]; #this
I suggest that you show us the whole piece and not just some parts to let us guess the rest.

Replies are listed 'Best First'.
Re: (4) Sorting numbers (not)
by Anonymous Monk on Jun 03, 2003 at 16:16 UTC
    Here is the code:
    @column13 is an array that takes the data per column1, 3 position and stores it in $start_bit_no per line. It gets every number in the file in that position. Maybe I'm not doing this correctly as you stated. This is what my code looks like:
    open(STDIN1, "<icd_meas_child.txt") or die "Cannot open file"; @row1 = <STDIN1>; for (@row1[$done1]) { chop(@row1); foreach (@row1[$count1]) { @column1 = split(/\,/,@row1[$count1]); $sat_name = @column1[0]; $meas_name = @column1[1]; $parent_meas = @column1[2]; $start_bit_no = @column1[3]; print ("$sat_name;"); print ("$meas_name;"); &DESCRIPTION; &DATA; print ("$size_bits_no;"); &DATA1; print ("$monitor_type;"); print ("$parent_meas;"); &BIT; print ("$start_bit_no;"); &SUBSYSTEM; &BOX; print ("$lsb_proc_ind;"); print ("$blank"); print ("\n"); $count1++; } $done1++; } close STDIN1; sub BIT #routine to sort numbers { if ($meas_name = $parent_meas) { my @nums = $start_bit_no; my @index= sort { $nums[$a-1] <=> $nums[$b-1] } 1..@nums; #$index++; print join "\n","@index;",''; } }
    My text file is this:
    A1,BL1CHILDB0,BL1PARENTMON,0 A1,BL1CHILDB1,BL1PARENTMON,1 A1,BL1CHILDB2,BL1PARENTMON,2 A1,BL1CHILDB3,BL1PARENTMON,3 A1,BL1CHILDB4,BL1PARENTMON,4 A1,BL2CHILDB5,BL1PARENTMON,5 A1,BL2CHILDB6,BL1PARENTMON,6 A1,BL2CHILDB7,BL1PARENTMON,7 A1,BL2CHILDB3,BL2PARENTMON,1 A1,BL2CHILDB6,BL2PARENTMON,0 A1,D1CHILDB0,D1PARENTMON,0 A1,D2CHILDB1T3,D1PARENTMON,1 A1,D3CHILDB4T5,D1PARENTMON,4 A1,D4CHILDB6,D1PARENTMON,6 A1,D5CHILDB7,D1PARENTMON,7

    2003-06-03 edit ybiC: <code> tags

      Now I know why people post as Anonymous Monk... sheesh.

      Very funny Scotty... Now PLEASE beam down my PANTS!

      Update: You should have seen the above before ybic added code tags... youch
      I can't tell, whether my correction will give you the desired result - NO - I'm SURE they won't - but maybe it gives you an idea where you lack knowledge.
      open(STDIN1, "<icd_meas_child.txt") # --NO-- or die "Cannot open file"; or die "Cannot open icd_meas_child.txt: $!\n"; # Don't leave people unsure about which file and what +reason ($!) @row1 = <STDIN1>; # What do you think you're doing here? # for (@row1[$done1]) # try foreach (@row) { # OUCH! Don't chop if you want to chomp! # chop(@row1); chomp; # And what do you think will this do? # foreach (@row1[$count1]) # { # @column1 = split(/\,/,@row1[$count1]); # $sat_name = @column1[0]; # $meas_name = @column1[1]; # $parent_meas = @column1[2]; # $start_bit_no = @column1[3]; ($sat_name, $meas_name, $parent_meas, $start_bit_no +)= split /,/; print ("$sat_name;"); print ("$meas_name;"); &DESCRIPTION; # <---- What do these do? &DATA; # <--/ print ("$size_bits_no;"); &DATA1; # ??? print ("$monitor_type;"); print ("$parent_meas;"); &BIT; print ("$start_bit_no;"); &SUBSYSTEM; # ??? &BOX; # ??? print ("$lsb_proc_ind;"); print ("$blank"); print ("\n"); $count1++; # } $done1++; } close STDIN1; sub BIT #routine to sort numbers { # OUCH! You know what you do??? # if ($meas_name = $parent_meas) # I think you meant if ($meas_name == $parent_meas) { # I won't even try to imagine what this line WILL do # my @nums = $start_bit_no; # I think it SHOULD do push(@nums, $start_bit_no); # So pushing the start bit to a global array my @index= sort { $nums[$a-1] <=> $nums[$b-1] } 1..@nums; # Fortunately you mad the following line a comment by a typo ;-) #$index++; # But here OUCH again #print join "\n","@index;",''; # Are you sure you didn't mean: print join("\n",@index),"\n"; } } __END__ A1,BL1CHILDB0,BL1PARENTMON,0 A1,BL1CHILDB1,BL1PARENTMON,1 A1,BL1CHILDB2,BL1PARENTMON,2 A1,BL1CHILDB3,BL1PARENTMON,3 A1,BL1CHILDB4,BL1PARENTMON,4 A1,BL2CHILDB5,BL1PARENTMON,5 A1,BL2CHILDB6,BL1PARENTMON,6 A1,BL2CHILDB7,BL1PARENTMON,7 A1,BL2CHILDB3,BL2PARENTMON,1 A1,BL2CHILDB6,BL2PARENTMON,0 A1,D1CHILDB0,D1PARENTMON,0 A1,D2CHILDB1T3,D1PARENTMON,1 A1,D3CHILDB4T5,D1PARENTMON,4 A1,D4CHILDB6,D1PARENTMON,6 A1,D5CHILDB7,D1PARENTMON,7