Rya*_*son 4 perl subprocess coding-style 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', ...);
Run Code Online (Sandbox Code Playgroud)
当我不得不一遍又一遍地做这种模式时,这种模式会变得有点烦人,特别是因为它涉及一堆我需要记住或查找的位置参数.是否有任何模块提供一个功能(让我们称之为myopen3),如下所示?
my ($wtr, $rdr, $err) = myopen3('some cmd and args', 'optarg', ...);
Run Code Online (Sandbox Code Playgroud)
或者它可以返回相关句柄的哈希或hashref:
my $process = myopen3('some cmd and args', 'optarg', ...);
$process->{STDIN}->print("Some input");
my $output = $process->{STDOUT}->readline;
Run Code Online (Sandbox Code Playgroud)
这样的功能的优点是,myopen3被称为以完全相同的方式内置的system(尽管不希望一些怪癖)避免,并且在返回散列或hashref,位置参数的情况下,和返回值.(另外,如果模块作者后来决定也返回pid和有关进程的其他信息,那么可以在保持向后兼容性的同时完成.)
我实际上自己实现了这个(使用简单的OO接口),但如果CPAN模块存在同样的事情,我宁愿不依赖我自己的自定义模块.
我到目前为止发现的最接近是IPC :: RunSession ::简单,它与返回的对象reader和writer方法.但是,该reader方法合并子进程的STDOUT和STDERR,而我希望选择将它们分开.
写自己的:
sub myopen3
{
my ($err, $in, $out);
my $pid = open3($in, $out, $err, @_);
return ($pid, $in, $out, $err);
}
Run Code Online (Sandbox Code Playgroud)