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

Thanks Tye for all your help :)
I need to ask you another question, b/c what you typed does work but, my <STDIN> is from a text file which contains multiple strings seperated by commas and I'm reading the number which I've initialized to be $start_bit_no. When I replace <STDIN> with $start_bit_no. I don't get the results. Here is the code:
foreach (@row1[$count1]) { @column1 = split(/\,/,@row1[$count1]); $sat_name = @column1[0]; $meas_name = @column1[1]; $parent_meas = @column1[2]; $start_bit_no = @column1[3];
This is where $start_bit_no is initialized. Then I call a sub routine to sort what is in $start_bit_no. Which is the code you were first looking at. Why am I not seeing the output when I use your code?

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

Replies are listed 'Best First'.
Re: Re: Re: Sorting numbers (not)
by Skeeve (Parson) on Jun 03, 2003 at 10:25 UTC
    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.
      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