Вы открываете файлы для записи (>
) и улучшаете их для чтения (+
). После открытия файла вы читаете из его файлового дескриптора и распечатываете то, что прочитали, в файловом дескрипторе по умолчанию (STDOUT
). Когда вы закончите, вы закрываете файл.
Если файл еще не существует, вы создадите его, не будет ничего для чтения (и ничего для печати), и вы закроете все еще пустые файлы.
Я не знаю, что вы пытаетесь сделать. Если вы пытаетесь добавить строки в файл, вы можете вместо этого открыть его для добавления (>>
). Когда вы хотите напечатать этот дескриптор файла, вы должны указать print
, какой дескриптор файла вы хотите использовать:
#!/usr/bin/perl
use strict;
use warnings;
my @alpha = ("aa".."ab");
for my $combo ( @alpha ) {
open my $fh, ">>", $combo or die "die open failed: $!";
printf $fh "[%s] Here's a new line in $combo\n", scalar localtime;
}
Это производит файлы с выводом как:
[Fri Feb 24 09:07:17 2012] Here's a new line in aa
[Fri Feb 24 09:08:52 2012] Here's a new line in aa
Если вы пытаетесь одновременно печатать в файл и на стандартный вывод (поскольку вы упоминаете тройник), вы можете создать файловый дескриптор, который мультиплексируется в один или несколько других файловых дескрипторов. IO :: Tee может сделать это за вас:
#!/usr/bin/perl
use strict;
use warnings;
use IO::Tee; # get from CPAN
my @alpha = ("aa".."ab");
for my $combo ( @alpha ) {
open my $fh, ">>", $combo or die "die open failed: $!";
my $tee = IO::Tee->new( $fh, \*STDOUT );
printf $tee "[%s] Here's a new line in $combo\n", scalar localtime;
}
Теперь каждая строка вывода идет в два места: экран и файл.