4

在 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,它返回一个带有readerwriter方法的对象。但是,该reader方法合并了子进程的 STDOUT 和 STDERR,而我希望可以选择将它们分开。

4

1 回答 1

5

只需编写自己的:

sub myopen3
{
    my ($err, $in, $out);
    my $pid = open3($in, $out, $err, @_);
    return ($pid, $in, $out, $err);
}
于 2010-06-21T18:19:46.000 回答