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
ますが、標準入力とファイル入力の両方を処理できる、この問題に対するよりクリーンな解決策があることを願っています。