1

在下面的代码中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;如果是的话,我很乐意在那里重新发布它;让我知道。
4

1 回答 1

1

在阅读了 Maxim Yegorushkin 的评论后,我意识到我所要做的就是摆脱sleep 1第二个版本中的 。即,这正是我想要的:

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

EOF正如 Maxim 所写,内部循环在接收到;时终止。然后外循环将脚本返回到阻塞状态,等待输入……Doh!

于 2012-04-13T01:22:25.453 回答