以前の質問での議論により、Perlがデフォルトでラインバッファ出力を提供することがわかりました。
$| = 0; # for buffered output (by default)
バッファリングされていない出力を取得する場合は、特別な変数$|
を1に設定します。
$| = 1; # for unbuffered output
今、私は、バッファリングされていない出力を好む可能性のある状況は何である可能性があるかを知りたいですか?
以前の質問での議論により、Perlがデフォルトでラインバッファ出力を提供することがわかりました。
$| = 0; # for buffered output (by default)
バッファリングされていない出力を取得する場合は、特別な変数$|
を1に設定します。
$| = 1; # for unbuffered output
今、私は、バッファリングされていない出力を好む可能性のある状況は何である可能性があるかを知りたいですか?
インタラクティブなタスクには、バッファなしの出力が必要です。つまり、誰かまたは他の何かが出力に応答することを期待しているときに、出力がバッファにスタックしたくないということです。
たとえば、STDOUTに送信されたユーザープロンプトをバッファリングしたくない場合があります。(そのため、STDOUTは、端末に接続されたときに完全にバッファリングされることはありません。ラインバッファリングのみであり、STDINからの読み取りを試みることによってバッファがフラッシュされます。)
たとえば、パイプやソケットを介して送信されたリクエストがバッファに詰まらないようにする必要があります。これは、接続のもう一方の端がそれを認識しないためです。
私が考えることができる他の唯一の理由は、パニックや信号による死などの回復不能なエラーが発生した場合に、重要なデータをバッファに残したくない場合です。
たとえば、重大な問題を診断できるようにするために、ログファイルをバッファリングしないでおくことができます。(これが、STDERRがデフォルトでバッファリングされない理由です。)
設定の学習から恩恵を受けたStackOverflowのPerlユーザーの小さなサンプルを次に示します$| = 1
。
STDOUTが外部にリダイレクトされ、コンソールに出力が表示されない
Sleep()を使用すると、PerlPrint関数が正しく機能しません
親プロセスが子の出力を終了するまで表示しないのはなぜですか?
改行を追加または削除すると、このperl forループ関数の方法が変わるのはなぜですか?
Perlでは、改行を待つのではなく、入力が到着したらすぐに処理するにはどうすればよいですか?
画面に表示されているとおりに出力ストリームを維持する簡単な方法は何ですか(インタラクティブデータを使用している間)?
プロセスが終了する前にperlCGIから印刷することは可能ですか?
ソケットまたはパイプを介して別のプログラムに書き込む場合に便利です。また、プログラムの状態をライブで監視するためにデバッグ情報をSTDOUTに書き込む場合にも役立ちます。