perl脚本不断从STDIN读取数据

perl脚本不断从STDIN读取数据,perl,stdin,pipe,Perl,Stdin,Pipe,我有两个任务脚本 第一个输出数据行(以RT/LF终止)到标准输出 第二个保持从STDIN读取数据,以便按照以下方式进行进一步处理: use strict; my $dataline; while(1) { $dtaline = ""; $dataline = <STDIN>; until( $dataline ne "") { sleep(1); $dataline = <STDIN>; }

我有两个任务脚本

第一个输出数据行(以RT/LF终止)到标准输出

第二个保持从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";
使用严格;
我的$dataline;
而第(1)款{
$dtaline=“”;
$dataline=;
直到($dataline ne“”){
睡眠(1);
$dataline=;
}
#接下来将使用非空数据行进行进一步处理
} 
打印“退出…\n”;
我使用如下管道将输出从第一个重定向到第二个:perl-scrt1 | perl-scpt2

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

想知道是否有类似经历的人能帮忙


谢谢。

你似乎把事情弄得比实际情况复杂得多。Perl通常使用阻塞I/O,这意味着在有完整的输入行之前,
不会返回

use strict; 
use warnings; # use this too

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

print "quitting...\n";
使用严格;
使用警告;#也用这个
while(my$dataline=){
#接下来将使用非空数据行进行进一步处理
}
打印“退出…\n”;

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

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

use strict; 
use warnings; # use this too

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

print "quitting...\n";
使用严格;
使用警告;#也用这个
while(my$dataline=){
#接下来将使用非空数据行进行进一步处理
}
打印“退出…\n”;

当没有更多输入时(在您的示例中,当scrt1退出时),
返回
unde
,这将在
时退出
循环。(Perl向
while($var=)
循环添加了一个隐式
定义的
测试。)

这两个脚本都要一直运行。当涉及到第二个脚本时,当它没有轮询上一个脚本中的数据时,它应该只休眠一段时间,然后在休眠后重新开始。@w2j3s8,轮询仅在非阻塞I/O时才需要。从STDIN读取通常是阻塞的,因此您不需要做任何特殊的事情来等待更多的输入。当脚本2从STDIN读取时,没有可用的输入,它会自动等待更多的输入。@cjm,不,它不工作:第二个脚本仍然一次又一次地获取相同的数据。就在这里,我不允许复制和粘贴所有输出。@cjm,我只剩下一行就进行了一些过滤:20101128T14:16:43调试:line=20101128T14:17:0调试:line=20101128T14:17:0调试:line=@cjm,对不起,我不知道如何在这里进行格式化工作。只要看一下“id”值——这些行是相同的。这两个脚本都要一直运行。当涉及到第二个脚本时,当它没有轮询上一个脚本中的数据时,它应该只休眠一段时间,然后在休眠后重新开始。@w2j3s8,轮询仅在非阻塞I/O时才需要。从STDIN读取通常是阻塞的,因此您不需要做任何特殊的事情来等待更多的输入。当脚本2从STDIN读取时,没有可用的输入,它会自动等待更多的输入。@cjm,不,它不工作:第二个脚本仍然一次又一次地获取相同的数据。就在这里,我不允许复制和粘贴所有输出。@cjm,我只剩下一行就进行了一些过滤:20101128T14:16:43调试:line=20101128T14:17:0调试:line=20101128T14:17:0调试:line=@cjm,对不起,我不知道如何在这里进行格式化工作。只要看看“id”值,这些行是相同的。