从文件中读取行,计算Perl中相同文件的平均值,写入平均值

时间:2016-02-23 11:57:03

标签: perl loops foreach

我有一个包含浮点数的行的文件,如下所示:

1.66278886795044
1.61858296394348
1.66523003578186
1.62150096893311
1.6725389957428

我正在尝试打开该文件,计算所有行的平均值,然后将平均值写入同一文件。如果5代表项目数量,那么预期的输出将是:

1.66278886795044
1.61858296394348
1.66523003578186
1.62150096893311
1.6725389957428
================
AVERAGE after 5 runs: 1.6481283664703

考虑到我可以从脚本$amountofloops中的较高位置获取运行量,我认为这样做:

open(my $overviewhandle, '>>', 'overview.txt');
chomp( my @durations = <$overviewhandle> );
my $avgtime = 0;
foreach my $duration (@durations) {
    $avgtime += $duration;
}
$avgtime = $avgtime / $amountofloops;
print $overviewhandle "================\nAVERAGE after $amountofloops runs: $avgtime";
close $overviewhandle;

然而,$avgtime一直返回零,我不知道为什么。我认为这个数字不会被解析为数字。

3 个答案:

答案 0 :(得分:4)

您应始终将use strictuse warnings添加到您编写的任何Perl程序的顶部。他们帮助您找到错误。

在这种情况下,你会看到错误:

  

仅为输出

打开Filehandle $ overviewhandle

在我看来,这个问题非常明显。

答案 1 :(得分:3)

文件的打开模式是错误的。您需要将其置于读/写模式,而不是追加模式

open(my $overviewhandle, '+<','overview.txt');
chomp( my @durations = <$overviewhandle> );
my $avgtime = 0;
foreach my $duration (@durations) {
    $avgtime += $duration;
}
$avgtime = $avgtime / scalar @durations;
print $overviewhandle "================\nAVERAGE after $amountofloops runs: $avgtime";
close $overviewhandle;

答案 2 :(得分:0)

open my $in, '<', 'in.txt' or die $!;

my $count = 0;
my $total;
while(<$in>){
    $count++;
    $total += $_;
}

open my $out, '>>', 'in.txt' or die $!;

my $average = $total/$count;
print $out "\n================\n";
print $out "AVERAGE after $count runs: $average\n";