如何逐行读取另一个程序的标准错误?

How can I read from the standard error of another program, line by line?

这个程序捕获了另一个程序的所有标准错误,但它有时会给我一个部分行:

#!/bin/env perl6

my $proc = Proc::Async.new('./print_to_stderr');

$proc.stderr.tap( -> $str {
    for $str.lines() {
        put "Captured ERR: $_";
    }
});

my $promise = $proc.start;

await $promise;

使用./print_to_stderr

#!/bin/env perl6

for ^10 {
    $*ERR.put: "($_): Howdee";
}

刚才,我得到以下输出:

Captured ERR: (0): Howdee
Captured ERR: (1): Howdee
...
Captured ERR: (6): Howdee
Captured ERR: (7): Howde
Captured ERR: e
Captured ERR: (8): Howdee

如您所见,对于项目 7,标准误差在两个不同的 tap 之间分解。但我希望它等待并给我一整行。


更新:这对我来说可以使用 Rakudo Star 2017.04 重现,但这在 Rakudo Star 2017.07 中不是问题,正如下面 Elizabeth Mattijsen 所指出的。

您使用的是哪个版本的 Rakudo Perl 6?我无法重现这个问题。无论如何,Supply.lines 永远不会给你不完整的行。因此,如果最新版本的 Rakudo Perl 6 发生这种情况,则应将其报告为错误。