我有两个任务脚本。
第一个输出数据行(以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获得初始数据行。
不知道有没有相似经历的人可以帮助一下吗?
感谢。
答案 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 = <>)
测试。)