當我發出一個Perl腳本時,一些標準輸入,例如如何重置在Perl中接收標準輸入的文件句柄?
$ awk '{print $1"\t"$2}' foo.txt | myScript.pl
我有一個包含bug的腳本。它讀取標準輸入的第一線,從第一行得到的東西,然後只能通過後續讀取標準輸入的n個解析線2:
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
循環之前的第一行,但我希望有一個更清晰的解決方案,這個問題允許我處理標準輸入和文件輸入。
當然!我完全忘了'做'時間。非常優雅,謝謝。 – 2009-12-11 06:25:31
只記得下一個/最後一個沒有看到do {}作爲塊;有關標準解決方法,請參閱http://perldoc.perl.org/perlsyn.html#Statement-Modifiers。 – ysth 2009-12-11 17:21:22