raku - 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';
}
Raku 中的等效结构是什么?
我可以将任何输入发送到外部cat
进程以将其返回到我可以传递给另一个进程的流中,但这太糟糕了。
我发现这个Raku 模块似乎相关,但它具有“输入和输出”作为 TODO,所以它现在对我没有帮助。
这个网站上也有这个问题与这个问题密切相关。该作者要求提供一种不依赖外部流程的解决方案,就像我一样,但公认的解决方案仍然使用外部流程。
最后,我注意到Raku课程的文档IO::Pipe
,它似乎应该符合要求。但是,该页面说:
Pipes can be easily constructed with sub run and Proc::Async.new.
...我明确地想避免。我尝试创建一个新IO::Pipe
对象,希望我可以以自然的方式使用它in
和out
流,但我得到:
> my $pipe = IO::Pipe.new
Required named parameter 'on-close' not passed
in block <unit> at <unknown file> line 1
文档页面上没有提到该参数,所以我想我在这里冒险进入了未定义的领域。
解决方案
因此,这变得令人尴尬地容易。只需为的参数提供一个布尔True
值,然后访问结果进程的字段并写入它。run
in
in
my $proc = run 'my-command', 'and', 'args', :in;
$proc.in.say('Hello world!');
$proc.in.close;
推荐阅读
- android - 具有来自 firebase 的数据的多个布局 recyclerView
- reactjs - 带 React 的 Stripe Connect
- javascript - 文件切换js在角度6中不起作用
- autoconf - autoconf:如何完全禁用语言检查(没有可用的 c 编译器)
- javascript - 无法解析 express.Multer req.file 中的 multipart/form-data 以 udefined 的形式出现
- javascript - 进入-更新-退出模式后节点的 x 和 y 属性丢失
- jquery - 没有为“eq()”返回值?
- javascript - 为什么 module.exports 可以保存 String 对象和模块实例,但不能保存 String 文字和模块实例?
- javascript - 打字稿错误?或者只是打字稿检查并不完美?
- javascript - 如何在不使用的情况下触发 html5 验证