Как печатать сразу в два файла?

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

for my $fh (FH1, FH2, FH3) { print $fh "whatevern" }

я нашел его в 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 "whatevern"; }

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

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

5 ответов


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

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"; }

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

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

но современный подход является первым.


Я бы просто использовать 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 для более продвинутого использования.


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

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


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

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"; }

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

open (MYFILEA, $stat_file);
open (MYFILEB, $stat_file2);
for my $fh ( \*MYFILEA, \*MYFILEB ) { print $fh "whatever\n" } 
close (MYFILEA);
close (MYFILEB);