Когда я запускаю сценарий Perl, некоторый стандартный ввод, например.
$ awk '{print $1"\t"$2}' foo.txt | myScript.pl
У меня есть скрипт, который содержит ошибку. Он читает первую строку стандартного ввода, получает что-то из этой первой строки, а затем анализирует только строки со 2 по n стандартного ввода при последующем чтении:
open (FH, "< $input") or die $?;
my $firstLine = <FH>; // reads first line
...
while (my $line = <FH>) {
// reads lines 2 through n
}
close (FH);
Поэтому я добавил в этот скрипт оператор 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);
Добавление этого оператора seek
работает для файлового ввода, но не для стандартного ввода. Скрипт вылетает с ошибкой:
error: could not reset file handle
Как я могу правильно прочитать первую строку стандартного ввода в начале скрипта, сбросить дескриптор файла, а затем прочитать все строки стандартного ввода с 1 по n?
Я думаю, что могу написать специальный случай для хранения и обработки первой строки перед циклом while
, но я надеюсь, что есть более чистое решение этой проблемы, которое позволит мне обрабатывать как стандартный ввод, так и файловый ввод.