从文件/管道读取一行并在while循环中重用它

时间:2015-11-24 17:03:16

标签: perl while-loop seek

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

所以我的伪代码是

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

}

也许,有这样的解决方案吗?

while ($line, <INPUT>) {

}

3 个答案:

答案 0 :(得分:3)

向后看:

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;
   }
}

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

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

这样的事可能

my $first_line;

while ( <> ) {

    $first_line //= $_;

    # Process $_
}