Эта тема на forum.dklab.ru


Enilatiar: Последовательное чтение из нескольких файлов одновременно
Задача: Есть несколько текстовых файлов. Необходимо печатать последовательно по одной строчке из каждого файла.

Требования:
Т1. Имена файлов задаются в командной строке.
T2. Все файлы целиком в память загонять нельзя.
T3. Других файлов создавать нельзя. Исключение, - вывод можно осуществлять в результирующий файл.
Дмитрий Котеров:

use Symbol;
my @F = map { open my $f=gensym, $_; $f } @ARGV;
while (1) {
my $printed = 0;
foreach (@F) {
next if eof $_;
print scalar <$_>;
$printed++;
}
last if !$printed;
}

Enilatiar:
Способ немного сбоит на последних строчках файлов, которые не заканчиваются \n

Вот некрасивое, но лекарство:
use Symbol;
my @F = map { open my $f=gensym, $_; $f } @ARGV;

while (1) {
my $printed = 0;
foreach (@F) {
next if eof $_;
my $s = scalar <$_>;
chomp $s;
print $s, "\n";
$printed++;
}
last if !$printed;
}

Дмитрий Котеров:
Явно закрывать файлы не нужно — сами закроются, как только @F уйдет за пределы видимости. Достаточно сделать так:

{{{
use Symbol;
my @F = map { open my $f=gensym, $_; $f } @ARGV;
...
}}}

Anonymous:
Полагаю, даже одних окружающих скобок будет достаточно.
Дмитрий Котеров:
Перенесено из форума: Программирование::Perl::Все в кучу.
Перенесено в форум: Программирование::Perl::Склад готовых решений.
Enilatiar:
use Symbol;
my @F = map { open my $f=gensym, $_; $f } @ARGV;

while ($_ = shift @F) {
next if eof $_;
chomp ( my $s = scalar <$_> );
print $s, "\n";
push @F, $_;
}

close $_ foreach @F;
Слегка модифицированный вариант кода 1) с одним циклом; 2) без флажка $printed; 2) с явным закрытием файлов.

Эта тема на forum.dklab.ru