我正嘗試從Perl中的管道中讀取非緩衝數據。例如在下面的程序中:從管道中讀取未緩衝的數據在Perl中
open FILE,"-|","iostat -dx 10 5";
$old=select FILE;
$|=1;
select $old;
$|=1;
foreach $i (<FILE>) {
print "GOT: $i\n";
}
iostat每隔10秒(五次)吐出數據。你會期望這個程序也這樣做。然而,相反,它似乎掛起了50秒(即10x5),之後它將全部的數據吐出。
我怎樣才能得到任何可用的數據(以無緩衝的方式),而不用等待EOF的所有方式?
P.S.我在Windows下看到了很多這方面的參考資料 - 我在Linux下這樣做。
你應該使用'while'而不是'foreach'。而你的輸出緩衝是不重要的,因爲它是一個輸入句柄而不是輸出句柄。 – tchrist 2012-03-09 17:45:24
使用while和foreach有什麼區別? – Jean 2012-03-12 16:46:22
@alertjean:在'foreach my $ i(){...}'中,文件讀取是在列表上下文中完成的,也就是說,在'foreach'循環中處理行之前讀取整個文件。在'while(my $ i = ){...}'中,讀取是在標量上下文中完成的,也就是說,讀取每行並在while塊中處理每行,然後讀取下一行。 –
2012-03-14 17:22:18