printのバッファ機能
perlのprint関数は標準でバッファをするみたいです。
なぜ?
システムコールを少なくするため。
printが呼び出されるたびにシステムコールをするのと、
バッファにある程度、溜まったらシステムコールするのとでは
後者のほうがシステムコールを少なくできるのは明らか。
バッファ機能を無効に
バッファ機能を無効にして、print関数が呼び出されるたびに出力するには以下のように変数$|に0以外の値をセットします。
$| = 1
for($i=0;$i<10;$i++){ print '.'; sleep(1); } __END__
このプログラムはforループを抜け出したときに、バッファがフラッシュされます。
$| = 1; for($i=0;$i<10;$i++){ print '.'; sleep(1); } __END__
このように変数$|に0以外の値をセットすると、バッファ機能が解除されます。
forループ内のprint文が実行されるたびに、'.'が出力されます。
他の機能
print文に改行コードがあるとバッファしない
for($i=0;$i<10;$i++){ print ".\n"; sleep(1); } __END__
このようにprint文に改行コード"\n"があると、バッファはされません。
print文が実行されるたびに、".\n"が出力されます。
system関数を呼び出すと、バッファをフラッシュする
for($i=0;$i<10;$i++){ print ".\n"; system("/bin/echo",'Hello'); sleep(1); } __END__
このようにsystem関数を呼び出すと、それまでにバッファに溜まっているものをフラッシュしてからシステム関数が実行される。
だから、このプログラムではprint文の出力".\n"がsystem関数が実行される前に、出力される。