【问题标题】:perl script keeps reading data from STDINperl 脚本不断从 STDIN 读取数据
【发布时间】:2010-12-27 07:00:00
【问题描述】:

我有 2 个脚本用于一个任务。

第 1 行数据(以 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。

但是我遇到的这 2 个 scpt 的问题是,如果在初始加载后不再有数据,第二个 scpt 似乎会继续从第一个 scpt 获取数据行的初始加载。

不知道有没有类似经历的人可以帮忙一点?

谢谢。

【问题讨论】:

    标签: perl stdin pipe


    【解决方案1】:

    您似乎使这比需要的复杂得多。 Perl 通常使用阻塞 I/O,这意味着 &lt;STDIN&gt; 在输入完整行之前不会返回。

    use strict; 
    use warnings; # use this too
    
    while (my $dataline = <STDIN>) {
      #further processing with a non-empty data line follows   
    }
    
    print "quitting...\n";
    

    当没有更多输入时(在您的示例中,当 scrt1 退出时),&lt;STDIN&gt; 返回undef,这将退出while 循环。 (Perl 在while ($var = &lt;&gt;) 循环中添加了一个隐式的defined 测试。)

    【讨论】:

    • 这两个脚本都应该一直运行。而当涉及到第二个脚本时,它应该只是休眠一段时间,因为它没有轮询前一个脚本的数据,并在休眠后一遍又一遍地重新开始。
    • @w2j3s8,只有非阻塞 I/O 才需要轮询。从 STDIN 读取通常是阻塞的,所以你不需要做任何特殊的事情来等待更多的输入。当脚本 2 从 STDIN 读取,并且没有可用输入时,它会自动等待更多输入。
    • @cjm,不,它不起作用:第二个脚本仍然一次又一次地获取相同的数据。就在这里,我不允许复制和粘贴所有输出。
    • @cjm,我设法在只剩下 1 行的情况下进行了更多过滤:20101128T14:16:43 调试:line= 20101128T14:17:0 调试:line= 20101128T14:17:0 调试:line=
    • @cjm,对不起,我不知道如何在这里进行格式化。只需查看“id”值 - 这些行是相同的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多