Чтение одной строки из файла / канала и повторное ее использование в цикле while
У меня есть дескриптор файла для чтения данных из файла или из канала. Во-первых, я прочитал одну строку из дескриптора файла. Затем мне нужно выполнить while
цикл, с учетом ранее прочитанной строки. я думаю seek
Функция проблематична с трубами.
Так что мой псевдокод
local $line = <INPUT>;
seek(INPUT, -length($line), 1);
# if block
while (<INPUT>) {
}
Возможно, есть решение, подобное этому?
while ($line, <INPUT>) {
}
3 ответа
Решение
Просто запомните первую строку в переменной. Прочитайте следующую строку из дескриптора файла в конце цикла:
#!/usr/bin/perl
use warnings;
use strict;
open my $FH, '-|', 'echo 3 ; seq 1 10' or die $!;
if (defined( my $first = <$FH> )) {
my $line = $first;
while () {
chomp $line;
print "$line:$first";
last if eof $FH;
$line = <$FH>;
}
}
Оглядываясь назад:
my $prev;
while (defined( my $line = <> )) {
... Use $prev and $line. $prev might not be defined. ...
$prev = $line;
}
Жду с нетерпением:
my $line = <>;
while (defined($line)) {
my $next = <>;
... Use $line and $next. $next might not be defined. ...
$line = $next;
}
В парах:
if (defined( my $line1 = <> )) {
while (defined( my $line2 = <> )) {
... Use $line1 and $line2. Both will be defined. ...
$line1 = $line2;
}
}
Многое зависит от того, почему вы хотите это сделать. Самый простой способ - написать цикл чтения и сохранить строку при первом запуске. Вероятно, нет необходимости читать первую строку, а затем вставлять ее в цикл чтения.
Что-то вроде этого возможно
my $first_line;
while ( <> ) {
$first_line //= $_;
# Process $_
}