我想创建一个包装器,它将从STDIN获取数据并将其传递给另一个脚本,等待他的STDOUT响应并将其输出到父端的STDOUT。
我有以下代码,但它似乎不起作用:
test.pl
#!/usr/bin/perl
#
use IPC::Open2;
$pid = open2( \*RDR, \*WTR, '/usr/bin/perl test2.pl');
while (<STDIN>) {
print WTR;
}
while (<RDR>) {
print STDOUT;
}
在test2.pl上,我有:
#!/usr/bin/perl
#
while (<STDIN>) {
print STDOUT;
}
似乎写入test2.pl但我没有来自test2.pl的反馈。
任何提示?
感谢的,
答案 0 :(得分:2)
从close WTR
开始阅读时,您应该STDIN
。在你执行此操作之前,你的外部命令会一直保持输入,如果你正在缓冲,你的外部程序将不会终止,也不会输出任何内容。
您的主要脚本和外部命令中的可能是"suffering from buffering"。
在测试脚本中,您可以将$|=1
添加到脚本的顶部,以使其输出更具响应性。但是,您可能无法影响任意外部命令的输出缓冲。
更新:IPC::Open2
已经在写文件句柄上设置了autoflush,因此外部命令不会缺乏输入。