如何在Perl中重置接收标准输入的文件句柄?

Ale*_*lds 0 perl file-io seek

当我发布Perl脚本时,一些标准输入,例如

$ awk '{print $1"\t"$2}' foo.txt | myScript.pl
Run Code Online (Sandbox Code Playgroud)

我有一个包含bug的脚本.它读取标准输入的第一行,从第一行获取内容,然后在后续读取时仅解析标准输入的第2行到第n行:

open (FH, "< $input") or die $?;
my $firstLine = <FH>; // reads first line

...

while (my $line = <FH>) {
    // reads lines 2 through n
}
close (FH);
Run Code Online (Sandbox Code Playgroud)

所以我seek在这个脚本中添加了一个语句,试图将文件句柄重置为文件的开头:

use Fcntl qw(:seek);

...

open (FH, "< $input") or die $?;
my $firstLine = <FH>; // reads first line
seek (FH, 0, SEEK_SET) or die "error: could not reset file handle\n"; // should reset file handle

...

while (my $line = <FH>) {
    // reads lines 1 through n (in theory)
}
close (FH);
Run Code Online (Sandbox Code Playgroud)

添加此seek语句适用于文件输入,但不适用于标准输入.该脚本崩溃并出现错误:

 error: could not reset file handle 
Run Code Online (Sandbox Code Playgroud)

如何在脚本开头正确读取标准输入的第一行,重置文件句柄,然后读取标准输入的所有第1行到第n行?

我想我可以编写一个特殊的案例来存储和处理while循环之前的第一行,但我希望有一个更清晰的解决方案来解决这个问题,它允许我处理标准输入和文件输入.

Ano*_*on. 7

有一个简单的方法:

open (FH, "< $input") or die $?;
my $line = <FH>; // reads first line

//do stuff with first line

do {
    //stuff
} while ($line = <FH>);
Run Code Online (Sandbox Code Playgroud)