Вам просто нужно прочитать строки из чередующихся файлов.
Например:
open my $fh1, '<', $file1 or die "$0: $file1: $!\n";
open my $fh2, '<', $file2 or die "$0: $file2: $!\n";
while () {
defined(my $line1 = readline $fh1) or last;
defined(my $line2 = readline $fh2) or last;
print $line1, $line2;
}
В качестве альтернативы вы можете выполнить чтение в условии цикла, но это может выглядеть немного странно:
while (
defined(my $line1 = readline $fh1) &&
defined(my $line2 = readline $fh2)
) {
print $line1, $line2;
}
Это остановится, как только в самом коротком файле закончатся строки.
Если вы всегда хотите обработать все строки, вы можете использовать следующее решение (которое обобщает в более чемдва файла):
my @fhs = ($fh1, $fh2);
while (@fhs) {
my $fh = shift @fhs;
defined(my $line = readline $fh) or next;
push @fhs, $fh;
print $line;
}
Это сохранит чтение строк из первого дескриптора файла в @fhs
, а затем повернет массив (переместив первый дескриптор в последнюю позицию).Когда дескриптор файла заканчивается строк, он удаляется из массива.Это продолжается до тех пор, пока все дескрипторы не будут исчерпаны.
Если вы хотите, чтобы он остановился, как только в первом дескрипторе закончатся строки, измените next
на last
.