Как печатать сразу в два файла?
у меня возникли проблемы с получением этой строки кода для работы:
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);