从 file/pipe 中读取一行并在 while 循环中重复使用

Read one line from file/pipe and reuse it in a while loop

我有一个文件句柄可以从文件或管道中读取数据。首先,我从文件句柄中读取了一行。然后,我需要执行一个 while 循环,同时考虑到先前读取的行。我认为 seek function 与管道有问题。

所以我的伪代码是

local $line = <INPUT>;
seek(INPUT, -length($line), 1);
# if block
while (<INPUT>) {

}

也许有这样的解决方案?

while ($line, <INPUT>) {

}

只要记住变量中的第一行。在循环结束时从文件句柄读取下一行:

#!/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;
   }
}

很大程度上取决于你为什么要这样做。最简单的方法就是编写一个 while read 循环并在第一次执行时保存该行。可能不需要读取第一行,然后再将其送入读取循环

也许是这样的

my $first_line;

while ( <> ) {

    $first_line //= $_;

    # Process $_
}