以下代码工作正常:
open( PIPE,'-|','ant' ); for( <PIPE> ) { print; }
但是,它没有做我想要的.由于Ant构建可能需要5分钟,我希望逐行看到输出.
相反,我在流程结束时获得了整个输入.
使用Perl调试器查看它,Perl等待’for’语句,直到Ant终止.这是为什么?
解决方法
只是为了完整性(问题在Uri的回答评论中得到解决)问题出现了,因为for表达式评估<>列表上下文中的运算符(
see),等效于以下内容:
foreach $line (@lines = <PIPE>) { print $line; }
在列表上下文中,<>运算符尝试从其输入读取所有行以指向列表 – 并且输入来自进程,它将阻塞直到进程结束.只有在它之后它才会进入循环体.
替代语法
while( <PIPE> ) { print; }
相当于
while( $line = <PIPE> ) { print $line; }
即,它在每次循环迭代中消耗来自输入的每一行,这是在这种情况下想要做的事情.