如何在可用时从stdin读取行(否则阻塞)?

时间:2012-04-13 00:36:36

标签: perl unix named-pipes

在下面的代码中,p00是一个命名管道,使用mkfifo p00创建。

在控制台1中,我跑了:

% perl -ne 'print "PERL: $_"' < p00

然后,当上面被阻止(如预期的那样)时,在控制台2中我跑了

% seq 3 > p00

结果,控制台1中出现以下内容:

PERL: 1
PERL: 2
PERL: 3
%

这是几乎我希望实现的结果,除了perl脚本在打印第三行后终止的事实。

  

我希望脚本在可用后继续回显行(前缀为“PERL:”),否则阻止

以上表达式上面的单行的变体类似期望的行为:

perl -e 'while ( 1 ) { print "PERL: $_" while <>; sleep 1 }' < p00

...但这不是真正的交易,因为它在等待输入时不会阻塞,也不会在输入时立即回应它。

注意:

  1. 这个问题背后的动机是教育(我的,那就是),仅此而已;我不是要解决任何实际问题;我只是想学习更多perl(和unix)。
  2. 我不确定这个问题是否更适合unix.se.com;如果是的话,我很乐意在那里重新发布;请告诉我。

1 个答案:

答案 0 :(得分:1)

在阅读Maxim Yegorushkin的评论之后,我意识到我所要做的就是摆脱第二版中的sleep 1。即,这完全符合我的要求:

perl -e 'while ( 1 ) { print "PERL: $_" while <> }' < p00

正如马克西姆所写,内环在收到EOF时终止;然后外部循环将脚本返回到阻塞状态,等待输入... Doh!