在 perl 中,我经常需要运行一个子进程,向它发送一些输入,然后读取它的输出。有许多模块可以做到这一点,但它们似乎都要求您传入预先存在的变量,然后由函数修改这些变量以包含文件句柄。这是IPC::Open3概要中的一个示例:
my ($wtr, $rdr, $err);
use Symbol 'gensym'; $err = gensym;
$pid = open3($wtr, $rdr, $err,
'some cmd and args', 'optarg', ...);
当我必须一遍又一遍地这样做时,这种模式会有点烦人,特别是因为它涉及到一堆我需要记住或查找的位置参数。是否有任何模块提供myopen3
如下功能(我们称之为)?
my ($wtr, $rdr, $err) = myopen3('some cmd and args', 'optarg', ...);
或者它可以返回相关句柄的哈希或哈希引用:
my $process = myopen3('some cmd and args', 'optarg', ...);
$process->{STDIN}->print("Some input");
my $output = $process->{STDOUT}->readline;
这种函数的优点myopen3
是调用方式与内置函数完全相同system
(尽管希望没有一些怪癖),并且在返回哈希或 hashref 的情况下,避免了位置参数和返回值。(此外,如果模块作者后来决定返回 pid 和有关进程的其他信息,则可以在保持向后兼容性的同时完成。)
我实际上是自己实现的(使用简单的 OO 接口),但如果存在 CPAN 模块来做同样的事情,我宁愿不依赖我自己的自定义模块。
到目前为止,我发现的最接近的是IPC::RunSession::Simple,它返回一个带有reader
和writer
方法的对象。但是,该reader
方法合并了子进程的 STDOUT 和 STDERR,而我希望可以选择将它们分开。