Perlで出力のバッファリングを無効にするには
てっどさんからのネタで、てっどさんが自力で解決した話ですけど(笑)、勉強になったのでメモ。^^;
Perlの標準出力はバッファリングされてます。改行「\n」を出力すれば標準出力に出力されますけども、「\n」を出さなければプログラムが終了するまで一切出力されません。
たいていの場合はそれで問題ないと思うのですが、コンソールで何か進行状況を表示させたいとき、「\r」を使って一旦出力した文字を書き直したいと思うこともあるでしょう。例えば、「/」→「|」→「\」→「-」→「/」…のように棒をくるくる回転させたいとか。(笑)そんなときは、バッファリングをしないようにPerlに指示する必要があります。デフォルトではバッファリングされるので、改行を出力しない限り標準出力には何も出力されませんから、棒を回転させるとか(^^;)みたいな効果は不可能です。
で、バッファリングをしないようにするには、次のように書きます。
$| = 1;特殊変数 $| に数値0以外の値を格納すれば、バッファリングしなくなるようです。
Perlで出力のバッファリングを無効にするには - Sakura scope
printやwriteを実行する度にfflushが呼び出されるようになるそうで。
(1)ブロックバッファリング
Perlのprint関数は標準でブロックバッファリングを行います。(例外はディスプレイに出力する場合で、行バッファリングを行います。Perl 5.6以降 )
ブロックバッファリングとは、一定のバイト数までバッファにデータを蓄積するバッファリング方式のことです。バッファに蓄積された書き込み内容が一定のバイト数をこえると、実際にファイルに書き込みが行われれます。
一定のバイト数というのは、設定によりますが一般的に4kBくらいだと思います。
また、ファイルがクローズするタイミングでも、バッファの内容がファイルに書き出されます。(2)行バッファリング
バッファリングとは - Perlゼミ(サンプルコードPerl入門)
ディスプレイに出力するときは、行バッファリングが行われます。改行文字がでてくるまで、バッファに書き込み内容が蓄積され、改行が出現したときに、バッファの内容がファイルに書き出されます。