Raku:将字符串发送到子进程的标准输入



我想向子进程的标准输入流发送一个字符串,就像我在Perl5中可能做的那样:

pipe *READ, *WRITE;
if (my $pid = fork()) {
close READ;
print WRITE "Hello world!n";
close WRITE;
} else {
close WRITE;
open STDIN, '<&=' . fileno READ;
close READ;
exec 'cat';
}

拉库的同等建筑是什么?

我可以将任何输入发送到外部cat进程,以将其返回到可以传递给另一个进程的流中,但这太可怕了。

我发现这个Raku模块似乎很相关,但它有";输入和输出";作为TODO,所以现在对我没有帮助。

这个网站上也有这个问题,与这个问题非常吻合。这位作者要求一个不依赖外部流程的解决方案,就像我一样,但被接受的解决方案仍然使用外部流程。

最后,我注意到Raku的IO::Pipe类的文档,它似乎符合要求。然而,页面上写着:

Pipes can be easily constructed with sub run and Proc::Async.new.

这是我明确想要避免的。我尝试创建一个新的IO::Pipe对象,希望能以自然的方式使用它的inout流,但我得到了:

> my $pipe = IO::Pipe.new
Required named parameter 'on-close' not passed
in block <unit> at <unknown file> line 1

文档页面上没有提到这个参数,所以我想我已经冒险进入了未定义的领域。

所以这变得非常容易。只需为runin参数提供一个布尔值True,然后访问生成的进程的in字段并写入

my $proc = run 'my-command', 'and', 'args', :in;
$proc.in.say('Hello world!');
$proc.in.close;

最新更新