Hey Guys, I am still at the same place. I am writing these little pieces of code to try to learn the language better, so any advice would be useful. I am again parsing through tab delimited files and now trying to find fish from on id (in these case families AS5 and AS9), retrieve the weights and average them. When I started I did it for one family and it worked (instead of the @families I had a scalar $family set to AS5). But really it is more useful to look at more than one family at time (I should mention that are 2 types of fish per family one ends in PS , the other doesn't). So I tried to use a foreach loop to go through the file twice, once with a the search value set to AS5 and a second time to AS9. It works for AS5, but for some reason, the foreach loop sets $test to AS9 the second time, but it doesn't go through the while loop. What am I doing wrong?
here is the code: #! /usr/bin/perl use strict; use warnings; my $file = $ARGV[0]; my @family = ('AS5','AS9'); my $i; my $ii; my $test; open (my $fh, "<", $file) or die ("Can't open $file: $!"); foreach (@family){ $test = $_; my @data_weight_2N = (); my @data_weight_3N = (); while (<$fh>){ chomp; my $line = $_; my @data = split ("\t", $line); if ($data[0] !~ /[0-9]*/){ next;} elsif ($data[1] eq "ABF09-$test"){ $i += 1; push (@data_weight_2N, $data[6]); }elsif ($data[1] eq "ABF09-".$test."PS"){ $ii += 1; push (@data_weight_3N,$data[6]); } } my $mean_2N = &average (\@data_weight_2N); my $stdev_2N = &stdev (\@data_weight_2N); my $stderr_2N = ($stdev_2N/sqrt($i)); print "These are the the avearge weight, stdev and stderr for $test 2N:\t", $mean_2N,"\t",$stdev_2N,"\t",$stderr_2N, "\n"; my $mean_3N = &average (\@data_weight_3N); my $stdev_3N = &stdev (\@data_weight_3N); my $stderr_3N = ($stdev_3N/sqrt($i)); print "These are the the avearge weight, stdev and stderr for $test 3N:\t", $mean_3N,"\t",$stdev_3N,"\t",$stderr_3N, "\n"; } close ($fh); sub average{ my($data) = @_; if (not @$data) { print ("Empty array\n"); return 0; } my $total = 0; foreach (@$data) { $total += $_; } my $average = $total / @$data; return $average; } sub stdev{ my($data) = @_; if(@$data == 1){ return 0; } my $average = &average($data); my $sqtotal = 0; foreach(@$data) { $sqtotal += ($average-$_) ** 2; } my $std = ($sqtotal / (@$data-1)) ** 0.5; return $std; } Thanks, T. -- "Education is not to be used to promote obscurantism." - Theodonius Dobzhansky. "Gracias a la vida que me ha dado tanto Me ha dado el sonido y el abecedario Con él, las palabras que pienso y declaro Madre, amigo, hermano Y luz alumbrando la ruta del alma del que estoy amando Gracias a la vida que me ha dado tanto Me ha dado la marcha de mis pies cansados Con ellos anduve ciudades y charcos Playas y desiertos, montañas y llanos Y la casa tuya, tu calle y tu patio" Violeta Parra - Gracias a la Vida Tiago S. F. Hori. PhD. Ocean Science Center-Memorial University of Newfoundland -- "Education is not to be used to promote obscurantism." - Theodonius Dobzhansky. "Gracias a la vida que me ha dado tanto Me ha dado el sonido y el abecedario Con él, las palabras que pienso y declaro Madre, amigo, hermano Y luz alumbrando la ruta del alma del que estoy amando Gracias a la vida que me ha dado tanto Me ha dado la marcha de mis pies cansados Con ellos anduve ciudades y charcos Playas y desiertos, montañas y llanos Y la casa tuya, tu calle y tu patio" Violeta Parra - Gracias a la Vida Tiago S. F. Hori. PhD. Ocean Science Center-Memorial University of Newfoundland