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

Reply via email to