0

我想制作一个从 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 的反馈。

有什么提示吗?

谢谢,

4

1 回答 1

2
  1. 你应该close WTR在读完STDIN. 在您执行此操作之前,您的外部命令将一直期待输入,并且如果您正在遭受缓冲,您的外部程序将不会终止并且它不会输出任何内容。

  2. 您可能在主脚本和外部命令中都“遭受缓冲” 。在您的测试脚本中,您可以添加到脚本的顶部以使其输出更具响应性。但是,您可能无法影响任意外部命令的输出缓冲。$|=1

更新:IPC::Open2已经在写入文件句柄上设置了 autoflush,因此外部命令不会因输入而饿死。

于 2013-08-30T19:26:47.460 回答