我有一个整数数组(@BondLength),每个数字大约有14位数字:
1.4913648111713
1.49444103262725
1.49324445420032
1.49781641064584
1.49375901670919
1.48388476641551
1.49205194279556
1.48573550809019
1.48486531375745
1.48899462725693
1.48455818343371
1.49451162591664
1.49687975468973
1.48919777061343
1.48460466118088
我把它们作为“数据”字段,加上它们的“平均值”(我也成功地能够达到10位数)进入子程序:
sub stdev{
my($data) = @_;
my $average = $_;
if(@$data == 1){
return 0;
}
my $sqtotal = 0;
foreach(@$data) {
$sqtotal += ($average-$_) ** 2;
}
my $std = ($sqtotal / (@$data-1)) ** 0.5;
return $std;
}
但是当我用必要的参数调用这个子程序时:
my $stdev = &stdev(@BondLength, $average);
printf("\nThe standard deviation NCABondLength: $stdev");
我输出的只是“0”。我知道它的值大于零直到十进制小数位,因为我将其输入Excel。我在这个剧本中做错了什么? (我现在通过网上阅读内容来修改太多,但仍然保持“0”)。
感谢。
答案 0 :(得分:3)
代码的第二行存在问题。当您说my($data) = @_
这就是为什么子程序返回零值的原因。你可以试试这个。
#!/usr/bin/perl
use strict;
use warnings;
sub average {
my $data = shift;
my $count = @$data;
my $sum;
foreach my $element (@$data){
$sum += $element;
}
return $sum / $count;
}
sub stdev {
my ($average, $data) = @_;
my $count = @$data;
my $sum;
my $variance;
$sum += (($_ - $average) ** 2) foreach @$data;
$variance = $sum / $count;
return $variance ** 0.5;
}
}
my @array = qw/
1.4913648111713
1.49444103262725
1.49324445420032
1.49781641064584
1.49375901670919
1.48388476641551
1.49205194279556
1.48573550809019
1.48486531375745
1.48899462725693
1.48455818343371
1.49451162591664
1.49687975468973
1.48919777061343
1.48460466118088
/;
my $average = average(\@array);
my $deviation = stdev($average, \@array);
printf "Standard deviation is %.5f\n", $deviation; #print number to five decimal places.
#output 0.00461