2017-07-08 45 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,可以讓你重新打開一個開放的流。