2013-09-24 38 views
1

我有一個整數,每個約14個數字的陣列(@BondLength):問題與數字在Perl

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」)。

謝謝。

+1

總是使用'​​use strict;使用警告;'! – ikegami

+0

改變你的第二和第三行。 '我的($ data,$ average)= @ _'並確保你在子程序調用'&stdev(\ @ BondLength,$ average)'中傳遞一個數組引用。請參閱我的答案以獲取示例代碼。 –

回答

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