Как распечатать на два файла одновременно? - PullRequest
7 голосов
/ 22 марта 2011

У меня проблемы с получением этой строки кода:

for my $fh (FH1, FH2, FH3) { print $fh "whatever\n" }

Я нашел его на perldoc , но он не работает для меня.

Код, который у меня есть на данный момент:

my $archive_dir = '/some/cheesy/dir/';
my ($stat_file,$stat_file2) = ($archive_dir."file1.txt",$archive_dir."file2.txt");
my ($fh1,$fh2);

for my $fh (fh1, fh2) { print $fh "whatever\n"; }

Я получаю ошибки "Bareword" в части (fh1, fh2), потому что я использую strict. Я также заметил, что они пропустили ; в этом примере, поэтому я предполагаю, что, кроме этого, могут быть и другие ошибки.

Какой правильный синтаксис для печати в два файла одновременно?

Ответы [ 5 ]

17 голосов
/ 22 марта 2011

Вы не открыли файлы.

my ($fh1,$fh2);
open($fh1, ">", $stat_file) or die "Couldn't open $stat_file: $!";
open($fh2, ">", $stat_file2) or die "Couldn't open $stat_file2: $!";

for my $fh ($fh1, $fh2) { print $fh "whatever\n"; }

Обратите внимание, что я не использую голые слова. В старину вы бы использовали:

open(FH1, ">$stat_file");
...
for my $fh (FH1, FH2) { print $fh "whatever\n"; }

но современный подход прежний.

7 голосов
/ 22 марта 2011

Я бы просто использовал IO :: Tee .

use strict;
use warnings;
use autodie; # open will now die on failure
use IO::Tee;

open my $fh1, '>', 'file1';
open FH2, '>', 'file2';

my $both = IO::Tee->new( $fh1, \*FH2 );

print {$both} 'This is file number ';

print {$fh1} 'one';
print FH2    'two';

print {$both} "\n";
print {$both} "foobar\n";

$both->close;

Запуск вышеуказанной программы приводит к:

file1

This is file number one
foobar

file2

This is file number two
foobar

Я бы порекомендовал прочитать весь файл perldoc для более расширенного использования.

4 голосов
/ 22 марта 2011

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

Поэтому убедитесь, что у вас действительно открыты файлы, затем просто замените часть (fh1, fh2) фактическими дескрипторами файла (которые будут ($fh1, $fh2) или что-то в этом роде)

0 голосов
/ 22 марта 2011

другая версия, основанная на ответе Брайана:

open(my $fh1, ">", $stat_file) or die "Couldn't open $stat_file!";
open(my $fh2, ">", $stat_file2) or die "Couldn't open $stat_file2!";
for ($fh1, $fh2) { print $_ "whatever\n"; }
0 голосов
/ 22 марта 2011

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

open (MYFILEA, $stat_file);
open (MYFILEB, $stat_file2);
for my $fh ( \*MYFILEA, \*MYFILEB ) { print $fh "whatever\n" } 
close (MYFILEA);
close (MYFILEB); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...