加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

如何获得Perl管道的输出?

发布时间:2020-12-15 21:55:36 所属栏目:大数据 来源:网络整理
导读:以下代码工作正常: open( PIPE,'-|','ant' );for( PIPE ) { print;} 但是,它没有做我想要的.由于Ant构建可能需要5分钟,我希望逐行看到输出. 相反,我在流程结束时获得了整个输入. 使用Perl调试器查看它,Perl等待’for’语句,直到Ant终止.这是为什么? 解决方
以下代码工作正常:
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;
}

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读