Вот лучшая идея:
#!/usr/bin/perl
use warnings;
use strict;
use File::Slurp qw<append_file read_file>;
my @input_files = ( 'a'..'z' );
foreach my $file_name ( @input_files ) {
my $contents = read_file( "/home/${file_name}_all.txt" );
append_file( "/home/${file_name}${_}_all.txt", $contents ) foreach 2..3;
}
Я не вижу, что вы вносите изменения в то, что выписываете, так что, похоже, вы просто хотите сбросить ${letter}_all.txt
в ${letter}${num}_all.txt
.
Или, если вы хотите узнать, как сделать более нормальную версию стандартного Perl, я внес следующие изменения.
use warnings;
use strict;
use English qw<$OS_ERROR>;
my $_arry_counter = 1;
# no reason to write the whole alphabet
my @input_files_1 = 'a'..'z';
# I'm not sure what you thought you could do with your foreach loop expression.
foreach my $file_names (@input_files_1) {
# save! the path
my $path = "/home/${file_names}_all.txt";
# open *lexical* handles and die with *explicit* message and OS error.
open my $input,'<', $path or die "unable to open file '$path'! - $OS_ERROR";
# best way to do this to minimze IO is to write two files at once to two
# two different handles.
my @outs
= map {
# repeating practice with inputs
my $out_path = "/home/${file_names}$_\_all.txt";
open my $out, '>>', or die "unable to open file '$out_path'! - $OS_ERROR";
$out;
} 2..3;
while ( my $line = <$input> ) {
# in this foreach $_ is a handle, so we need to save the line in a var.
print $_ $line foreach @outs;
}
# close each output
close $_ foreach @outs;
# close current input
close $input;
}
Моя версия того, что вы положили в комментарии, была бы больше похожа на эту:
use English qw<$RS>; # record separator -> $/
my $regex = qr{
(^ \@ .* )
# note that I turn on s for *select* sections
( (?s) .*? )
( ^ (windows|linux) .* )
( (?s) .*? )
( ^ (windows|linux) .* )
( (?s) .*? )
}mx;
foreach my $file_name ( @input_files ) {
my $contents = read_file( "/home/jbutler/final/${file_name}_all.txt" );
local $RS = 'Data';
$contents =~ s/$regex/$1$2$3$4\n__Data__\n$1\n$5$6/m;
append_file( "/home/jbutler/final/${file_name}${_}_all.txt", $contents ) foreach 2..3;
}
Но я не проверял это.