是否有一个perl模块可以启动进程并将三个主I / O句柄返回到该进程?

时间:2010-06-21 18:17:03

标签: perl coding-style subprocess perl-module filehandle

在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', ...);

或者它可以返回相关句柄的哈希或hashref:

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,而我希望选择将它们分开。

1 个答案:

答案 0 :(得分:5)

写下你自己的:

sub myopen3
{
    my ($err, $in, $out);
    my $pid = open3($in, $out, $err, @_);
    return ($pid, $in, $out, $err);
}