将文本文件作为块处理

Sup*_*ech 1 perl

我的代码有什么问题吗?我的 DATA 有 4 个块,但我的代码仅打印前三个块的结果。当我从文件中读取数据时获得相同的结果。

#!/usr/bin/perl
use 5.30.3;
use warnings;
my $sum=0;
my $block=1;

while(<DATA>){
    chomp(my $line = $_);
    if ($line !~ /^$/){
        $sum = $sum+$line;
    }else{
        say "Sum of block-${block}: $sum";
        $sum = 0;
        $block++;
    }
}

__DATA__
345
478

300
255
100

1200
1000
4000

182
347
611
714
Run Code Online (Sandbox Code Playgroud)

打印结果:

Sum of block-1: 823
Sum of block-2: 655
Sum of block-3: 6200
Run Code Online (Sandbox Code Playgroud)

zdi*_*dim 7

当遇到空行时,程序会打印总和,但数据结束后没有多余的行。解决此问题的一种方法是使用eof测试文件结尾。

程序稍微重新安排

use strict;
use warnings;
use feature 'say';

my $sum = 0;
my $block = 0;

while (my $line = <DATA>) {
    chomp $line;

    if ($line =~ /^$/ or eof DATA){
        ++$block;
        say "Sum of block-$block: $sum";
        $sum = 0;
    } else {
        $sum += $line;
    }
}

say "Read $block blocks";

__DATA___
...
Run Code Online (Sandbox Code Playgroud)