在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,它返回一个包含reader
和writer
方法的对象。但是,reader
方法合并子进程的STDOUT和STDERR,而我希望选择将它们分开。
答案 0 :(得分:5)
写下你自己的:
sub myopen3
{
my ($err, $in, $out);
my $pid = open3($in, $out, $err, @_);
return ($pid, $in, $out, $err);
}