2017-07-08 18 views
4

はバックそのオウムの日中のPerl 6のための回答のカップルがあり、彼らは、現在動作していないようです:どのようにしてPerl 6ファイルハンドラを自動フラッシュできますか?

これは実装MoarVMバージョン2017.04から53-g66c6dda 上に構築されたRakudoバージョン2017年4月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 

は、ここで私は一緒に遊んでいたプログラムです。

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

しかし、それは動作しません:autoflush方法に言及しHow could I disable autoflush?はありません

タイプのインボカントのためのそのような方法で '自動フラッシュ' 'IOは::ハンドル'

は、私は、すべての出力後にフラッシュするIOクラスを作成することで、自分自身を偽造することができたと思います。それが価値があるのは、この機能がないために、今日の特定のタスクにPerl 6を使用できなくなったことです。

2番目の質問として、なぜ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 Star 2017.10で動作します。

+0

FWIW TTYハンドルはバッファされず、これを設定する必要はありません。 OPの観察された振る舞いは、まだlibuvの非同期入出力を使って2017.04が出力されているためです。 –

+1

'$ * ERR.out-buffer'と' $ * OUT.out-buffer'を 'False'に設定すると、あなたの出力がリダイレクトされたりパイプされたりしているときにも便利です(例えば' 2>&1 | less')。 – mscha

3

Rakudoは(まだ)自動フラッシュをサポートしていません。 $OUTPUT_AUTOFLUSHの項目の下に5to6-perlvarのメモがあります。

raiphは他の場所では#perl6 IRC log searchと表示され、人々が自動フラッシュを推奨し続けていることを示しており、他の人々は実装されていないと言っています。それは文書化された方法ではないので(flushですが)、私はちょっとだけ生きなければならないと思います。

+0

これは単純で不満な答えですが、なぜ私たちがそれを持っていないのかという二次的な質問を追加しました。理論的根拠や技術的な制限の詳細がある場合は、それが人々にとって有益だと思います。 –

+0

文書は間違っていました(今は[改訂](https://github.com/perl6/doc/commit/29e7f545bb74002648d2e2e7732decd2cfe65617))。 * autoflush *は実装されていません。実装されていないバッファリング**です(拡張子はautoflushです)。 フロントエンドの同期IOのためにバックエンドで非同期IOを使用していたため、表示されている動作が疑わしいです。その部分は現在(2017.06以降)同期されています。また、バッファリングを追加するための現在の実験的な作業があります。おそらく ':buffer'引数を' open'にします(デフォルトでは現在オフになっており、後日デフォルトで有効にすることができます)。 –

5

非常に最近、出力リファクタリングがありました。 rakudoの私の地元のバージョンで私はそれが間違った順序を与えるために得ることができない、それ以上(2017.06-173-ga209082 built on MoarVM version 2017.06-48-g4bc916e

それはあなたが数に設定することができますハンドルをIO(または:!bufferとしてそれを渡す)する:buffer引数は今ありますこれを制御する。

出力isattyがバッファリングしない場合は、デフォルトと仮定します。

0

あなたはSTDOUTとSTDERRで主に興味があるならは、次のようにバッファリングすることなく、それらを再度開くように見える(オートフラッシュ):

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

これは徹底的にまだテストされていない、と私は、この驚きました働くオープンストリームを再び開くことができる面白いAPIです。

関連する問題