我怎样才能自动刷新 Perl 6 filehande?

How can I autoflush a Perl 6 filehande?

Parrot 时代的 Perl 6 有几个答案,但它们目前似乎不起作用:

This is Rakudo version 2017.04.3 built on MoarVM version 2017.04-53-g66c6dda implementing Perl 6.c.

Does perl6 enable “autoflush” by default? 的回答说它默认启用(但那是 2011 年)。

这是我正在玩的程序:

$*ERR.say: "1. This is an error";
$*OUT.say: "2. This is standard out";

及其输出,这是一个不幸的命令:

2. This is standard out
1. This is an error

所以也许我需要打开它。 How could I disable autoflush? 提到了 autoflush 方法:

$*ERR.autoflush = True;
$*ERR.say: "1. This is an error";
$*OUT.say: "2. This is standard out";

但这不起作用:

No such method 'autoflush' for invocant of type 'IO::Handle'

我想我可以通过让我的 IO class 在每次输出后刷新来自己伪造这个。就其价值而言,正是由于缺少此功能,我今天才无法将 Perl 6 用于特定任务。

作为次要问题,为什么 Perl 6 现在没有这个功能,尤其是当它看起来像以前有的时候?您如何说服 Perl 5 用户这不是问题?

Rakudo 不支持自动刷新(目前)。在 $OUTPUT_AUTOFLUSH 条目下的 5to6-perlvar 中有一个注释。

raiph 在别处发表了一条评论 #perl6 IRC log search showing that people keep recommending autoflush and some other people keep saying it's not implemented. Since it's not a documented method (although flush 是),我想我们将不得不生活一段时间。

最近有一个输出重构。使用我的本地版本的 rakudo,我无法让它再发出错误的命令 (2017.06-173-ga209082 built on MoarVM version 2017.06-48-g4bc916e)

现在有一个 io 句柄的 :buffer 参数,您可以将其设置为一个数字(或将其作为 :!buffer 传递)来控制它。

如果输出 isatty 不缓冲,我假设默认值。

如果您主要对 STDOUT 和 STDERR 感兴趣,以下似乎可以在不缓冲(自动刷新)的情况下重新打开它们:

$*OUT = $*OUT.open(:!buffer);
$*ERR = $*ERR.open(:!buffer);

这还没有经过全面测试,我很惊讶它能起作用。这是一个有趣的 API 让你重新打开打开的流。

当你问这个问题时,这可能还没有奏效,但是:

$*ERR.out-buffer = False;
$*ERR.say: "1. This is an error";
$*OUT.say: "2. This is standard out";

有点难找,不过有记载here

在 Rakudo Star 2017.10 为我工作。