6

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

这是基于 MoarVM 版本 2017.04-53-g66c6dda 实现 Perl 6.c 的 Rakudo 版本 2017.04.3。

perl6是否默认启用“autoflush”的答案?说它默认启用(但那是 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

所以也许我需要打开它。有我如何禁用自动刷新?其中提到了一种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

4 回答 4

6

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

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

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

于 2017-07-08T16:59:55.557 回答
4

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

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

有点难找,但在此处记录。

在 Rakudo Star 2017.10 中为我工作。

于 2017-12-16T13:05:08.500 回答
3

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

raiph 通过#perl6 IRC 日志搜索在其他地方发表了评论,显示人们一直在推荐 autoflush,而其他一些人一直说它没有实现。由于它不是一个记录在案的方法(尽管flush是),我想我们将不得不忍受一段时间。

于 2017-07-08T15:19:31.310 回答
1

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

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

这还没有经过彻底的测试,我很惊讶它的工作原理。这是一个有趣的 API,可让您重新打开打开的流。

于 2017-09-20T08:17:43.957 回答