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

Sea*_*ean 10 raku

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

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';
}
Run Code Online (Sandbox Code Playgroud)

Raku 中的等效结构是什么?

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

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

这个网站上也有这个问题,与这个问题密切相关。该作者要求提供一种不依赖外部流程的解决方案,就像我一样,但公认的解决方案仍然使用外部流程。

最后,我注意到Raku课程的文档IO::Pipe,它似乎应该符合要求。但是,该页面说:

Pipes can be easily constructed with sub run and Proc::Async.new.
Run Code Online (Sandbox Code Playgroud)

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

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

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

Sea*_*ean 9

所以结果证明这很容易令人尴尬。只需Truerun'sin参数提供一个布尔值,然后访问结果进程的in字段并写入它。

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