Perl: открытие файла и сохранение его под другим именем после редактирования - PullRequest
3 голосов
/ 15 января 2010

Я пытаюсь написать скрипт конфигурации. Для каждого клиента он запрашивает переменные, а затем пишет несколько текстовых файлов.

Но каждый текстовый файл нужно использовать более одного раза, поэтому он не может перезаписать их. Я бы предпочел, чтобы он читался из каждого файла, вносил изменения, а затем сохранял их в $ name.originalname.

Возможно ли это?

Ответы [ 4 ]

4 голосов
/ 16 января 2010

Вы хотите что-то вроде Template Toolkit . Вы позволяете шаблонизатору открывать шаблон, заполнять заполнители и сохранять результат. Тебе не нужно было делать эту магию самостоятельно.

Для очень маленьких работ я иногда использую Text :: Template .

1 голос
/ 15 января 2010

Почему бы сначала не скопировать файл, а затем отредактировать скопированный файл

0 голосов
/ 15 сентября 2012

при условии, что вы хотите прочитать один файл, построчно вносите в него изменения, а затем записывайте в другой файл:

#!/usr/bin/perl

use strict;
use warnings;

# set $input_file and #output_file accordingly

# input file
open my $in_filehandle, '<', $input_file or die $!;
# output file
open my $out_filehandle, '>', $output_file or die $!;

# iterate through the input file one line at a time
while ( <$in_filehandle> ) {

    # save this line and remove the newline
    my $input_line = $_;
    chomp $input_line;

    # prepare the line to be written out
    my $output_line = do_something( $input_line );

    # write to the output file
    print $output_line . "\n";

}

close $in_filehandle;
close $out_filehandle;
0 голосов
/ 15 января 2010

Код ниже ожидает найти шаблон конфигурации для каждого клиента, где, например, шаблон Джо joe.originaljoe и записывает вывод в joe:

foreach my $name (@customers) {
  my $template = "$name.original$name";
  open my $in,  "<", $template or die "$0: open $template";
  open my $out, ">", $name     or die "$0: open $name";

  # whatever processing you're doing goes here
  my $output = process_template $in;

  print $out $output           or die "$0: print $out: $!";

  close $in;
  close $out                   or warn "$0: close $name";
}
...