ablog

不器用で落着きのない技術者のメモ

Perlで標準出力でバッファリングしないようにする

Perlで出力のバッファリングを無効にするには

てっどさんからのネタで、てっどさんが自力で解決した話ですけど(笑)、勉強になったのでメモ。^^;

Perlの標準出力はバッファリングされてます。改行「\n」を出力すれば標準出力に出力されますけども、「\n」を出さなければプログラムが終了するまで一切出力されません。
たいていの場合はそれで問題ないと思うのですが、コンソールで何か進行状況を表示させたいとき、「\r」を使って一旦出力した文字を書き直したいと思うこともあるでしょう。例えば、「/」→「|」→「\」→「-」→「/」…のように棒をくるくる回転させたいとか。(笑)

そんなときは、バッファリングをしないようにPerlに指示する必要があります。デフォルトではバッファリングされるので、改行を出力しない限り標準出力には何も出力されませんから、棒を回転させるとか(^^;)みたいな効果は不可能です。

で、バッファリングをしないようにするには、次のように書きます。

$| = 1;

特殊変数 $| に数値0以外の値を格納すれば、バッファリングしなくなるようです。
printやwriteを実行する度にfflushが呼び出されるようになるそうで。

Perlで出力のバッファリングを無効にするには - Sakura scope

(1)ブロックバッファリング
Perlのprint関数は標準でブロックバッファリングを行います。(例外はディスプレイに出力する場合で、行バッファリングを行います。Perl 5.6以降 )
ブロックバッファリングとは、一定のバイト数までバッファにデータを蓄積するバッファリング方式のことです。バッファに蓄積された書き込み内容が一定のバイト数をこえると、実際にファイルに書き込みが行われれます。
一定のバイト数というのは、設定によりますが一般的に4kBくらいだと思います。
また、ファイルがクローズするタイミングでも、バッファの内容がファイルに書き出されます。

(2)行バッファリング
ディスプレイに出力するときは、行バッファリングが行われます。改行文字がでてくるまで、バッファに書き込み内容が蓄積され、改行が出現したときに、バッファの内容がファイルに書き出されます。

バッファリングとは - Perlゼミ(サンプルコードPerl入門)