如何获得Perl管道的输出?

Uri*_*Uri 7 perl pipe

以下代码工作正常:

open( PIPE, '-|', 'ant' );
for( <PIPE> ) {
    print;
}
Run Code Online (Sandbox Code Playgroud)

但是,它没有做我想要的.由于Ant构建可能需要5分钟,我希望逐行看到输出.相反,我在流程结束时获得了整个输入.

使用Perl调试器查看它,Perl等待'for'语句,直到Ant终止.这是为什么?

leo*_*loy 8

只是为了完整性(问题在Uri的答案的评论中得到了解决)问题出现了,因为for表达式<>在列表上下文中评估运算符(请参阅参考资料),等效于以下内容:

foreach $line (@lines = <PIPE>) {
    print $line;
}
Run Code Online (Sandbox Code Playgroud)

在列表上下文中,<>操作员尝试从其输入读取所有行以指向列表 - 并且输入来自进程,它将阻塞直到进程结束.只有在它之后它才会进入循环体.

替代语法

while( <PIPE> ) {           
    print; 
} 
Run Code Online (Sandbox Code Playgroud)

相当于

while(  $line = <PIPE> ) {
    print $line;
}
Run Code Online (Sandbox Code Playgroud)

即,它在每次循环迭代中消耗来自输入的每一行,这是在这种情况下想要做的事情.