【问题标题】:Statistics in Perl ScriptPerl 脚本中的统计信息
【发布时间】:2012-07-24 08:46:53
【问题描述】:

我有以下问题: 我想创建一个 perl 脚本,它从文本文件(包含几列数字的文件)中读取并计算一些统计数据(平均值、中位数、标准差、方差)。我已经构建了一个脚本,但是由于我还没有爱上 perl,所以我无法解决它的语法问题...... 这是我的 perl 脚本..

#!/usr/bin/perl -w

use strict;
open(FILEHANDLE, data.txt);
while (<FILEHANDLE>) {
shift @ARGV;
my @array = split(\t,$_);
}
close(FILEHANDLE);
###### mean, sum and size
$N = $sum = 0;
$array[$x-1]; 
$N++;
$sum += $array[$x-1];
###### minimum and the maximum
($min = 0, $max = 0);
$max = $array[$x-1] if ($max < $array[$x-1]), (my@sorted = sort { $a <=> $b } @samples) {
print join(" ",@sorted);
}
##### median
if ($N % 2==1) {
print "$median = $sorted[int($N/2)]\n"; ## check this out
};
else ($median = ($sorted[$N/2] + $sorted[($N/2)-1]) / 2)) { 
print "$median\n"; # check this out
};
##### quantiles 1º and 3º
if $qt1 = $sorted[$r25-1] {
print "\n"; # check this out
};
else $qt1 = $fr*($sorted[$ir] - $sorted[$ir-1]) + $sorted[$ir-1] {
print "\n"; # check this out
};
##### variance
for (my $i=0; 
$i<scalar(@samples); 
$i++) 
{
$Var += ($samples[$i]-$mean)**2;
$Var = $Var/($N-1);
};
###### standard error
($Std = sqrt($Var)/ sqrt($N));
############################################################
print "$min\n";
print "$max\n";
print "$mean\n";
print "$median\n";
print "$qt1\n";
print "$var\n";
print "$std\n";

exit(0);

我想让它工作。请帮忙。提前致谢!

【问题讨论】:

  • 这是一团糟。我建议您制作函数,并在较小的范围内整理错误。例如。 sub sum { ... } 您可能也有兴趣查看CPAN 的一些模块,例如List::Util 的最小值和最大值等。
  • 谢谢,你是对的。我不允许使用 CPAN 模块。看剧本的时候头疼。正如我所说,我是 perl 的新手,这对我的大脑来说太多了。 xD。这个烂摊子应该可以工作,它只需要几个循环和计数器。
  • 如果这是作业,你应该用作业标签标记它。这段代码中有很多错误,你无法让别人指出它们。我建议您检查错误并一一修复。不要关闭严格和警告。
  • 抱歉,我看不懂这个脚本。如果你不爱perl,那么,你一定爱上了其他语言。或者,如果您需要帮助,您需要对他人更有礼貌,并对您的代码进行良好的格式化。
  • 另外,请检查 CPAN 上的 Statistics:: 等模块。

标签: perl statistics


【解决方案1】:

代码中的错误:

open(FILEHANDLE, data.txt);

data.txt 需要被引用。您没有检查打开的返回值,例如... or die $!。您应该使用词法文件句柄和三个参数 open,例如open my $fh, '&lt;', "data.txt" or die $!.

shift @ARGV;

除了从你的参数列表中删除第一个值之外,它什么也不做,然后立即丢弃。

my @array = split(\t,$_);

您使用\t 作为裸词,它应该是一个正则表达式/\t/。您的 @array 在 while 循环的词法范围内声明,并且在此块之外未定义。

$N = $sum = 0;

这两个变量都没有声明,这会导致你使用 strict 时脚本死掉(这是一个非常好的主意)。使用my $N 来解决这个问题。另外,$N 不是一个很好的变量名。

$array[$x-1];

这将无济于事。 $x 未声明(见上文),也未定义。整个语句什么都不做,就像有一行3;。相信你会得到Useless use of variable in void context之类的错误。

$N++;

这会将$N 增加到 1,这是没有用的,因为您只在上面几行将其初始化为 0。

嗯.. 名单还在继续。我建议你从小处着手,使用 strict 和 warnings,因为它们是非常好的工具,并一一解决错误。一个非常好的主意是为您的计算创建子程序,例如:

sub sum {
   # code here
   return $sum;
}

转到perldoc.perl.org 并阅读文档。特别有用的是语法相关的和perlfunc。

此外,您应该知道此功能可以在模块中找到,您可以在 CPAN 找到。

【讨论】:

    【解决方案2】:

    您的主要问题是您没有声明您的变量,例如$N、$max 等。

    您需要在第一次引用它们时使用my 引入所有新变量。就像您对 $array 和 $i 所做的那样。比如

    $N = $sum = 0;
    

    应该变成

    my( $N, $sum ) = ( 0, 0 );
    

    【讨论】:

    • 谢谢各位!今天对我来说太晚了。明天我会尝试你所有的建议。再次感谢。
    猜你喜欢
    • 2019-08-24
    • 2010-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-15
    • 1970-01-01
    相关资源
    最近更新 更多