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);
}
下記のサンプルで動作をご確認ください。
- フラッシュしないサンプル(注:表示されるまでに10秒ほどかかります)
- フラッシュするサンプル
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);
}
他にも色々書き方があるようです。
Posted by yujiro このページの先頭に戻る
- Perlでansibleライブラリを作成する方法
- perlのCPANモジュールからRPMを作成する方法
- Perlで「Subroutine permission redefined at~」を抑止する方法
- XML::Simpleのインストールでエラーになる場合の対処
- YAML::Tinyで「YAML::Tiny found bad indenting in line~」というエラーになる場合の対処
- Perlの正規表現を使って文字列をまとめて取得する方法
- Perlのハッシュでキーの有無を調べる方法
- perlで配列の途中の要素を削除する方法
- YAML::Tinyでコロンを利用する方法
- Perlで改行コードがCRのファイルを読み込む方法
- Perlで「Possible precedence issue with control flow operator」という警告の対処
- PerlのLWPで「Can't verify SSL peers without knowing which Certificate Authorities to trust」というエラーになったときの対処
- Perl+Windowsでファイルを再帰的にリネームする方法
- Perlプログラムの中でファイルの一部を書き換える方法
- Perlの「Bareword "%s" not allowed while "strict subs" in use~」というエラーについて
トラックバックURL
コメントする
greeting