【发布时间】:2012-03-27 01:19:35
【问题描述】:
我正在尝试从 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 的情况下返回任何可用的数据(以无缓冲的方式)?
附:我在 Windows 下看到过很多关于此的引用 - 我正在 Linux 下执行此操作。
【问题讨论】:
-
您应该使用
while而不是foreach。而且你的输出缓冲是无关紧要的,因为它是一个输入句柄而不是一个输出句柄。 -
使用while和foreach有什么区别?
-
@alertjean:在
foreach my $i (<FILE>) { ... }中,文件读取是在列表上下文中完成的,即在foreach循环中处理行之前读取整个文件。在while (my $i = <FILE>) { ... }中,读取是在标量上下文中完成的,即读取每一行,然后在 while 块中处理,然后再读取下一行。