Perl 如何从stdin中读取可用的行(否则阻止)?
在下面的代码中,Perl 如何从stdin中读取可用的行(否则阻止)?,perl,unix,named-pipes,Perl,Unix,Named Pipes,在下面的代码中,p00是一个命名管道,使用mkfifo p00创建 在控制台1中,我运行: % perl -ne 'print "PERL: $_"' < p00 因此,控制台1中出现以下内容: PERL: 1 PERL: 2 PERL: 3 % 这几乎是我希望达到的结果,除了perl脚本在打印第三行后终止 我希望脚本在行可用时继续回显行(前缀为“PERL:”),否则block 上面一个衬里的以下变体表面上类似于所需的行为: perl -e 'while ( 1 ) { print "
p00
是一个命名管道,使用mkfifo p00
创建
在控制台1中,我运行:
% perl -ne 'print "PERL: $_"' < p00
因此,控制台1中出现以下内容:
PERL: 1
PERL: 2
PERL: 3
%
这几乎是我希望达到的结果,除了perl
脚本在打印第三行后终止
我希望脚本在行可用时继续回显行(前缀为“PERL:”),否则block
上面一个衬里的以下变体表面上类似于所需的行为:
perl -e 'while ( 1 ) { print "PERL: $_" while <>; sleep 1 }' < p00
perl-e'while(1){print“perl:$\uuz”while;sleep 1}'
…但这不是真正的交易,因为它在等待输入时不会阻塞,也不会在输入可用时立即响应
注:
在阅读了Maxim Yegorushkin的评论后,我意识到我所要做的就是在第二个版本中去掉
sleep 1
。也就是说,这正是我想要的:
perl -e 'while ( 1 ) { print "PERL: $_" while <> }' < p00
perl-e'while(1){print“perl:$"while}'
正如Maxim所写,内部循环在接收到
EOF
时终止;然后外部循环将脚本返回到阻塞状态,等待输入。。。啊 在阅读了Maxim Yegorushkin的评论后,我意识到我所要做的就是摆脱第二版中的sleep 1
。也就是说,这正是我想要的:
perl -e 'while ( 1 ) { print "PERL: $_" while <> }' < p00
perl-e'while(1){print“perl:$"while}'
正如Maxim所写,内部循环在接收到
EOF
时终止;然后外部循环将脚本返回到阻塞状态,等待输入。。。啊 这是fifo
的行为方式:一旦编写器关闭它,读卡器就会获得EOF
。读者可能必须重新打开fifo
,但shell重定向无法完成。@MaximYegorushkin:你的评论让我意识到我所要做的就是摆脱睡眠1
!然后我发布的第二个版本正是我想要的。谢谢这是fifo
的行为方式:一旦编写器关闭它,读卡器就会获得EOF
。读者可能必须重新打开fifo
,但shell重定向无法完成。@MaximYegorushkin:你的评论让我意识到我所要做的就是摆脱睡眠1
!然后我发布的第二个版本正是我想要的。谢谢这很有趣;假设p00
是一个文件而不是FIFO。然后,修改后的脚本将在添加到文件中时读取额外的行(要么添加>
,要么重写文件并添加比以前更多的行)。因此,在新的读取尝试之前,Perl正在重置输入流(标准输入)上的EOF指示符;假设p00
是一个文件而不是FIFO。然后,修改后的脚本将在添加到文件中时读取额外的行(要么添加>
,要么重写文件并添加比以前更多的行)。因此,Perl在新的读取尝试之前重置输入流(标准输入)上的EOF指示符。