Альтернативный способ использования повторяющихся операторов обработки файлов в Perl - PullRequest
0 голосов
/ 26 сентября 2018

В Perl, чтобы избежать повторения кода, дизайна нет, я пытался использовать один и тот же дескриптор файла для записи одного и того же текстового файла в 2 разных каталога.Основываясь на выполнении моего кода, я обнаружил, что он недопустим, хотя я мог что-то упустить.Можете ли вы использовать один и тот же дескриптор файла для записи текстового файла и сохранения его в 2 разных каталогах?

Ищете лучший способ.Как я могу записать один и тот же текстовый файл в 2 разных каталога без дублирования и повторения кода?Подобно тому, как повторение происходит в следующих двух утверждениях:

open (my $fh_w1, ">$path1/$write_File");
open (my $fh_w2, ">$path2/$write_File");

Вот мой код:

#!/usr/bin/perl
use strict;
use warnings;


my $read_File = 'dataIn.txt';

my $path1 = 'C:\Perl\textfiles';
my $path2 = 'C:\Perl\databases';

my $write_File = 'dataOut.txt';

#open file for reading
open my $fh_r, '<', $read_File or die qq{Unable to open "$read_File" for input: $!};

#open file for writing
open (my $fh_w1, ">$path1/$write_File");
open (my $fh_w2, ">$path2/$write_File");

Ответы [ 2 ]

0 голосов
/ 28 сентября 2018

Perl Файл :: Копировать Модуль способен предоставлять функции копирования и перемещения. Мы можем заключить их в подпрограмму для достижения того же

use File::Copy;
copy("sourcefile","destinationfile") or die "Copy failed: $!";
copy("Copy.pm",\*STDOUT);
move("/dev1/sourcefile","/dev2/destinationfile");
use File::Copy "cp";
$n = FileHandle->new("/a/file","r");
cp($n,"x");
0 голосов
/ 26 сентября 2018

Когда вы открываете файл, то, к чему еще прикреплен дескриптор файла, закрывается первым.Начиная с close

Вам не нужно закрывать FILEHANDLE, если вы немедленно собираетесь сделать еще одно открытие, потому что open закрывает его для вас.

Так что вы можете сделать

open my $fh, '<', $file or die "Can't open $file: $!";
...
open $fh, '>', $out_file ...
...
open $fh, '>', $another_file ...

Это лишает вас возможности проверять ошибки на close $fh, что не , выполненное с автоматическимблизко.Кроме того, счетчик строки $. не сбрасывается таким образом.

Однако дескриптор файла не может быть объявлен повторно, как показывает показанный код.Будучи обычной лексической переменной, вы можете иметь только одну декларацию my в данной области.

Или вы можете написать подпрограмму, которая открывает файл или записывает его вообще.

Наконец, есть модули, которые уменьшают код до одной строки, например Path :: Tiny

use Path::Tiny;
...
path($file)->spew(@data);

, который также хорошо проверяет ошибки и выкрикивает, если что-то не так.

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