Вот пример того, как это можно сделать:
use feature qw(say);
use strict;
use warnings;
use List::Util qw(sum);
my $fn = 'ex.txt';
open ( my $fh, '<', $fn ) or die "Could not open file '$fn': $!";
my @lines;
my @count;
my $cur_count = undef; # undef --> before first line starting with 6
my $flag = 2;
while (my $line = <$fh>) {
chomp $line;
push @lines, $line;
if ( $line =~ /^6/) {
$cur_count = 0 if !defined $cur_count;
$flag = 2 if $flag == 1;
$cur_count++;
}
elsif ($line =~ /^5/ ) {
push @count, $cur_count if (defined $cur_count) && $flag == 2;
$cur_count = 0;
$flag = 1;
}
else {
$flag = 2 if $flag == 1;
}
}
push @count, $cur_count if defined $cur_count;
close $fh;
my $total = sum @count;
my $j = 0;
for (@lines) {
if (/^(5[^#]*)[#]+(.*)$/) {
say $1, (sprintf "%06d", $count[$j++]), $2;
}
elsif (/^(9[^#]*)[#]+(.*)$/) {
say $1, (sprintf "%06d", $total), $2;
}
else {
say;
}
}
Редактировать:
Для записи в файл из скрипта:
# [...]
my $savefn = 'output.txt';
open ( my $sfh, '>', $savefn ) or die "Could not open file '$savefn': $!";
my $j = 0;
for (@lines) {
if (/^(5[^#]*)[#]+(.*)$/) {
say $sfh $1, (sprintf "%06d", $count[$j++]), $2;
}
elsif (/^(9[^#]*)[#]+(.*)$/) {
say $sfh $1, (sprintf "%06d", $total), $2;
}
else {
say $sfh $_;
}
}
close $sfh;