couple general suggestions:
- use strict; At first, it'll generate a bunch of errors for you for undeclared variables, but it will help identify & reduce errors.
- Add some debugging statements. (Data::Dumper can be quite helpful, too)
e.g. the warnings indicate that one of the values it's trying to add to the sum is a string .. so in the first for loop put something like print Dumper [$i, $fields[$i]] if $fields[$i] =~ /s/;
Hmm .. actually, it might be your
split -- try
split(' ') instead -- see the split() docs for full info, including that
"split(/ /)" will give you as many null initial
fields as there are leading spaces. so it could be that your data file has leading spaces in it somewhere.
Here's a little refactoring example, too, to demo several more "perlish" constructs:
#!/usr/bin/perl -w
use strict;
my @sum;
my @sumsq;
my $n = 0;
while( <DATA> ){
my @fields = split / /;
foreach my $i ( 0..$#fields ){
$sum[$i] += $fields[$i];
$sumsq[$i] += $fields[$i]**2;
}
$n++;
}
$_ /= $n for @sum, @sumsq;
my @stddev = map { sqrt( $sumsq[$_] - $sum[$_]**2 ) } 0 .. $#sum;
print join(" ", @stddev) . "\n";
#foreach my $i ( 0 .. $#sum ){
# printf "%5s %10s %10s\n", $i, $sum[$i], $stddev[$i];
#}
__DATA__
1.8 2.5 3.8 1.9 -3.5 -3.5 3.2 -3.9 4.2 4.5 2.8
-1.3 -0.9 -0.7 -0.4 -0.8 -3.5 -3.5 -1.6 -4.5