如何自动刷新Perl 6文件?

时间:2017-07-08 15:04:09

标签: io perl6 autoflush

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

  

这是基于MoarVM版本2017.04-53-g66c6dda的Rakudo 2017.04.3版本   实施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";

但这不起作用:

  

对于'IO :: Handle'类型的调用者

,没有这样的方法'autoflush'

我想我可以通过让我的IO类在每次输出后刷新来自行伪造。对于它的价值而言,缺少这一功能阻碍了我今天使用Perl 6进行特定任务。

作为第二个问题,为什么Perl 6现在不具备此功能,特别是当它看起来曾经拥有它时?你会如何说服Perl 5人这不是问题?

4 个答案:

答案 0 :(得分:6)

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

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

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

答案 1 :(得分:4)

当您提出问题时,这可能还没有奏效,但是:

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

有点难以找到,但记录在案here

在Rakudo Star 2017.10中为我工作。

答案 2 :(得分:3)

Rakudo不支持autoflush(还)。 $OUTPUT_AUTOFLUSH条目下的5to6-perlvar中有一条注释。

raiph在其他地方发布了一条评论#perl6 IRC log search,显示人们一直在推荐autoflush,其他一些人一直说它没有实施。由于它不是一个记录在案的方法(虽然flush是),但我想我们必须没有一点点生活。

答案 3 :(得分:1)

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

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

尚未经过彻底测试,我很惊讶这是有效的。这是一个有趣的API,可以让你重新打开一个开放的流。