2016-02-23 81 views
0
写平均到同一个文件

我有一个包含与浮点数一些行的文件,像这样:读线,计算平均,在Perl

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

该文件的打开模式是错误的。你需要有它在读/写模式,无法追加模式

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; 
+0

经过测试,我发现'$#durations'返回一个小于数组的实际长度。任何想法为什么这样? –

+0

找出来了。你的方法只返回最后一个项目的索引。更好的方法描述[这里](http://stackoverflow.com/questions/7406807/find-size-of-an-array-in-perl)。我用'标量@持续时间'。 –

+0

对不起,关于一个关闭,我只是测试文件模式写,而不是看着那个。在现在的答案中改变了它 – Vorsprung

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"; 
4

你应该总是添加use strictuse warnings给你写任何Perl程序的顶部。他们帮助你找到错误。

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

Filehandle $overviewhandle opened only for output

其中,在我看来,使问题很明显。

+0

正如我希望从我的初始文章中可以明白的,这只是我整个脚本的一小部分。我使用严格和警告,因为它[先前指出](http://stackoverflow.com/questions/35552520/why-is-my-xml-file-empty-after-generating-with-xmllibxml# comment58793220_35552520)。尽管如此,我没有看到错误,因为我从终端运行脚本,脚本为终端写了很多内容(用于测试目的)。因此我没有看到那个错误。 –

+0

我可以建议运行你的程序,以便将STDOUT指向一个文件句柄,并将STDERR指向另一个文件句柄。这样可以更容易地发现错误和警告。 –