perl脚本不断从STDIN读取数据

时间:2010-12-27 07:00:01

标签: perl stdin pipe

我有两个任务脚本。

第一个输出数据行(以RT / LF结束)然后到STDOUT。

第二个继续从STDIN读取数据,以便按以下方式进行进一步处理:

use strict; 
my $dataline; 
while(1) { 
    $dtaline = ""; 
    $dataline = <STDIN>; 
    until( $dataline ne "") { 
        sleep(1); 
        $dataline = <STDIN>; 
    }

    #further processing with a non-empty data line follows   
} 

print "quitting...\n";

我使用管道将输出从第一个重定向到第二个:perl scrt1 | perl scpt2。

但是我对这两个scpts的问题在于,如果在初始加载后没有数据,第二个scpt会继续从第一个scpt获得初始数据行。

不知道有没有相似经历的人可以帮助一下吗?

感谢。

1 个答案:

答案 0 :(得分:4)

你似乎正在使它变得比它需要的复杂得多。 Perl通常使用阻塞I / O,这意味着<STDIN>在完整的输入行之前不会返回。

use strict; 
use warnings; # use this too

while (my $dataline = <STDIN>) {
  #further processing with a non-empty data line follows   
}

print "quitting...\n";

如果没有更多输入(在您的示例中,当scrt1退出时),<STDIN>将返回undef,这将退出while循环。 (Perl向defined循环添加了隐式while ($var = <>)测试。)