Как обновить набор оригинальных файлов с помощью Perl? - PullRequest
1 голос
/ 01 апреля 2011

Я хотел бы взять массив исходных файлов и обновить их .. Это означает, что я хотел бы использовать выходные_файлы в качестве входных_файлов для обновлений

Например:

a_all.txt --- обновить до ---> a2_all.txt --- обновить до -> a3_all.txt --- обновить до - a3_all.txt
следующий в массиве
b_all.txt --- обновить до ---> b2_all.txt --- обновить до -> b3_all.txt --- обновить до-- b3_all.txt
etc..to z_all.txt

Вот код, который я начал до сих пор, но я не знаю, как его закончить ..

#!/usr/bin/perl

use warnings;
use strict;

my $_arry_counter = 1;

my @input_files_1 = qw(a b c d e f g h i j k l m n o p q r s t u v w x y z);

foreach my $file_names (@input_files${_array_counter}) {   
    print  open 'INPUT_FILES','<',"/home/${file_names}_all.txt" or die "unable to open file !";

    while(<INPUT_FILES>) {
         open 'INPUT_FILES','>>',"/home/$file_count\
    }

    my @input_files_\$_ = open 'INPUT_FILES',>>
}

1 Ответ

1 голос
/ 01 апреля 2011

Вот лучшая идея:

#!/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; 
} 

Но я не проверял это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...