Статистика в Perl Script - PullRequest
       1

Статистика в Perl Script

0 голосов
/ 22 ноября 2011

У меня следующий вопрос: я хочу создать 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);

Я хочузаставить его работать.Пожалуйста помоги.СПАСИБО ЗА ПРЕДЕЛА!

Ответы [ 2 ]

4 голосов
/ 22 ноября 2011

Ошибки в вашем коде:

open(FILEHANDLE, data.txt);

data.txt должен быть заключен в кавычки.Вы не проверяете возвращаемое значение открытия, например ... or die $!.Вы должны использовать лексический дескриптор файла и открыть три аргумента, например, open my $fh, '<', "data.txt" or die $!.

shift @ARGV;

Это ничего не делает, кроме удаления первого значения из вашего списка аргументов, который затем незамедлительно отбрасывается.

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

Вы используете \t как голое слово, это должно быть регулярное выражение, /\t/.Ваш @array объявлен внутри лексической области видимости цикла while и будет не определен вне этого блока.

$N = $sum = 0;

Обе переменные не объявлены, что приведет к смерти сценария при использовании строгого (что очень хорошая идея).Используйте my $N, чтобы решить это.Кроме того, $N не очень хорошее имя переменной.

$array[$x-1];

Это ничего не даст.$x не объявлено (см. Выше), а также не определено.Целое утверждение ничего не делает, это как строка 3;.Я полагаю, что вы получите ошибку, такую ​​как Useless use of variable in void context.

$N++;

Это увеличивает $N до 1, что бесполезно, так как вы только несколько строк выше инициализировали его до 0.

Ну ... список можно продолжить.Я предлагаю вам начать с малого, использовать строгие и предупреждения, так как они являются очень хорошими инструментами, и исправлять ошибки одну за другой.Очень хорошей идеей было бы создать подпрограммы для ваших расчетов, например:

sub sum {
   # code here
   return $sum;
}

Перейдите на perldoc.perl.org и прочитайте документацию.Особенно полезными будут синтаксис и perlfunc .

Кроме того, вы должны знать, что эту функциональность можно найти в модулях, которые вы можете найти по адресу CPAN .

0 голосов
/ 22 ноября 2011

Ваша основная проблема в том, что вы не объявили свои переменные, такие как $N, $max и т. Д.

Вам нужно ввести все новые переменные с my при первом обращении к ним. Так же, как вы сделали с $array и $i. Так например

$N = $sum = 0;

Должен стать

my( $N, $sum ) = ( 0, 0 );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...