2017-07-08 44 views
4

有一对夫妇对Perl 6放回鹦鹉天的答案,他们似乎并不目前的工作:如何自动刷新Perl 6 filehande?

这是Rakudo版2017年4月3日建MoarVM版本2017.04-53-g66c6dda 实施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 ::句柄'

我想我可以通过使我的IO类在每次输出后刷新来自己伪造。对于它的价值,缺少这个特性使我无法使用Perl 6来完成当前的特定任务。

作为第二个问题,为什么现在没有Perl 6,特别是当它看起来像它曾经拥有它?你会怎样剥夺Perl 5这个人不是问题?

回答

2

这可能尚未工作时,你问的问题,而是:

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

这是一个有点难以找到,但它的记录here

适合我在Rakudo之星2017.10。

+0

FWIW TTY手柄没有被缓冲,因此不需要进行设置。 OP观察到的行为归因于2017年4月仍然使用libuv的异步IO进行输出。 –

+1

当您的输出被重定向或管道输入时(例如'2>&1 | less'),将'$ * ERR.out-buffer'和'$ * OUT.out-buffer'设置为'False'仍然有用。 – mscha

3

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

raiph在#perl6 IRC log search的其他地方发表了评论,表明人们不断推荐autoflush,其他人一直说它没有实现。由于它不是一个有文件记载的方法(尽管flush是),我想我们必须活得没有一点点。

+0

这是一个简单而不满意的答案,但我添加了第二个问题,问我们为什么没有它。如果你有理由或技术限制的细节,我认为这对人们有用。 –

+0

该文件被误解(现在[已修改](https://github.com/perl6/doc/commit/29e7f545bb74002648d2e2e7732decd2cfe65617))。这并不是说* autoflush *没有实现,它是**缓冲**,没有实现(并且扩展了autoflush)。 我怀疑你看到的行为是因为我们曾经在后端使用异步IO,甚至在前端使用同步IO。现在这部分(自2017.06起)已经同步。另外,目前有一些实验性的工作可以添加缓冲,可能在'open'的':buffer'参数(默认情况下关闭,以后可以默认启用)。 –

5

最近有一个输出反悔。随着我rakudo的本地版本我不能把它给错误的顺序的话(2017.06-173-ga209082 built on MoarVM version 2017.06-48-g4bc916e

现在有一个:buffer参数io的,你可以设置为一个数字手柄(或把它作为:!buffer),将控制这一点。

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

0

如果你在STDOUT和STDERR主要感兴趣,下面似乎重新打开无缓冲(自动刷新):

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

这不是还没有彻底测试,我很惊讶这作品。这是一个有趣的API,可以让你重新打开一个开放的流。