Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 如何从stdin中读取可用的行(否则阻止)?_Perl_Unix_Named Pipes - Fatal编程技术网

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}'
…但这不是真正的交易,因为它在等待输入时不会阻塞,也不会在输入可用时立即响应

注:

  • 这个问题背后的动机是教育(也就是我的),除此之外没有别的;我不想解决任何实际问题;我只是想学习更多的perl(和unix)
  • 我不确定这个问题是否更适合unix.se.com;如果是的话,我非常乐意将它重新发布到那里;请告诉我

  • 在阅读了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指示符。