【问题标题】:Read lines from file, calculate average, write average to same file in Perl从文件中读取行,计算平均值,将平均值写入 Perl 中的同一文件
【发布时间】:2016-06-05 06:11:12
【问题描述】:

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

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 一直返回零,我不知道为什么。我认为这个数字没有被解析为数字。

【问题讨论】:

    标签: perl loops foreach


    【解决方案1】:

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

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

    文件句柄 $overviewhandle 只为输出打开

    在我看来,这让问题变得非常明显。

    【讨论】:

    • 正如我希望从我最初的帖子中明确的那样,这只是我整个脚本的一个 sn-p。我确实使用了严格和警告,因为它是previously pointed out to me。但是,当我从终端运行脚本时,我没有看到错误,并且脚本向终端写入了很多内容(出于测试目的)。因此我没有看到那个错误。
    • 我可以建议运行您的程序,以便 STDOUT 指向一个文件句柄,而 STDERR 指向另一个文件句柄。这样就更容易发现错误和警告。
    【解决方案2】:

    文件的打开方式错误。你需要让它处于读/写模式,而不是附加模式

    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;
    

    【讨论】:

    • 经过测试,我发现$#durations 返回的比数组的实际长度小一。知道为什么会这样吗?
    • 想通了。您的方法仅返回最后一项的索引。 here 描述了更好的方法。我用scalar @durations
    • 是的,抱歉,我只是在测试文件模式写入,而不是看那个。现在修改答案
    【解决方案3】:
    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";
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多