Perlでフラッシュする方法

Perlでフラッシュする方法

Posted at May 21,2013 1:55 AM
Tag:[Perl]

Perlでフラッシュ(=バッファリングを抑止)する方法を紹介します。

Perlでフラッシュ

フラッシュすることで、print/printf/writeを実行するたびにバッファがフラッシュされ、リアルタイムに出力できるようになります。

1.標準出力(STDOUT)でフラッシュする

標準出力(STDOUT)をフラッシュするには、次の2通りがあります。

ひとつはIO::Handleを利用する方法です。

#!/usr/bin/perl
 
use IO::Handle;
STDOUT->autoflush(1);
 
for (my $i=0; $i<10; $i++) {
   print $i;
   sleep(1);
}

もうひとつは、特殊変数「$|」を利用する方法です。「$|」に0以外の値を設定すれば出力をバッファリングしなくなります。

#!/usr/bin/perl
 
local $| = 1;
 
for (my $i=0; $i<10; $i++) {
   print $i;
   sleep(1);
}

CGIも、次のように書けば同じ効果が得られます。

#!/usr/bin/perl
 
use CGI;
use IO::Handle;
STDOUT->autoflush(1);
 
my $q = new CGI;
print $q->header(-charset=>"utf-8");
 
for (my $i=0; $i<10; $i++) {
   print $i;
   sleep(1);
}

下記のサンプルで動作をご確認ください。

2.ファイル書き込みでフラッシュする

ファイル書き込みでフラッシュするのも、標準出力のときと同様、2通りあります。

ひとつはIO::Handleを利用する方法です。

#!/usr/bin/perl
 
use IO::Handle;
open my $fh, ">test.txt";
$fh->autoflush;
 
for (my $i=0; $i<10; $i++) {
   print $fh $i;
   sleep(1);
}

または特殊変数「$|」を利用する方法です。

#!/usr/bin/perl
 
open my $fh, ">test.txt";
(select($fh), $|=1);
 
for (my $i=0; $i<10; $i++) {
   print $fh $i;
   sleep(1);
}

他にも色々書き方があるようです。

What does “select((select(s),$|=1)[0])” do in Perl?
関連記事
トラックバックURL


コメントする
greeting

*必須

*必須(非表示)


ご質問のコメントの回答については、内容あるいは多忙の場合、1週間以上かかる場合があります。また、すべてのご質問にはお答えできない可能性があります。予めご了承ください。

太字イタリックアンダーラインハイパーリンク引用
[サインインしない場合はここにCAPTCHAを表示します]

コメント投稿後にScript Errorや500エラーが表示された場合は、すぐに再送信せず、ブラウザの「戻る」ボタンで一旦エントリーのページに戻り(プレビュー画面で投稿した場合は、投稿内容をマウスコピーしてからエントリーのページに戻り)、ブラウザをリロードして投稿コメントが反映されていることを確認してください。

コメント欄に(X)HTMLタグやMTタグを記述される場合、「<」は「&lt;」、「>」は「&gt;」と入力してください。例えば「<$MTBlogURL$>」は「&lt;$MTBlogURL$&gt;」となります(全て半角文字)