代码之家  ›  专栏  ›  技术社区  ›  Ryan C. Thompson

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

  •  4
  • Ryan C. Thompson  · 技术社区  · 15 年前

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

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

    my $process = myopen3('some cmd and args', 'optarg', ...);
    $process->{STDIN}->print("Some input");
    my $output = $process->{STDOUT}->readline;
    

    打电话 和内置的完全一样 system

    实际上,我自己实现了这一点(使用一个简单的OO接口),但是如果存在一个CPAN模块来做同样的事情,我宁愿不依赖我自己的定制模块。

    IPC::RunSession::Simple reader writer 读者 方法合并子进程的STDOUT和STDERR,而我希望使用选项将它们分开。

    1 回复  |  直到 15 年前
        1
  •  5
  •   JSBÕ±Õ¸Õ£Õ¹    15 年前

    写下你自己的:

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