Чтение одной строки из файла / канала и повторное ее использование в цикле 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 $_
}
Другие вопросы по тегам