gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 00:00:49 25 4
gpt4 key购买 nike

在 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 完全相同(尽管希望没有一些怪癖),并且在返回散列或散列引用的情况下,避免了位置参数和返回值。 (此外,如果模块作者后来决定返回 pid 和有关进程的其他信息,则可以在保持向后兼容性的同时完成。)

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

到目前为止我发现的最接近的是 IPC::RunSession::Simple ,它返回一个带有 reader 的对象和 writer方法。但是, reader方法合并子进程的 STDOUT 和 STDERR,而我想选择将它们分开。

最佳答案

只需编写自己的:

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

关于perl - 是否有一个 perl 模块可以启动一个进程并将三个主要 I/O 句柄返回给该进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3087263/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com