キッズプレート、パスタおかわり

プログラミングやデジモノについてあれこれ
--.--.-- --:--|カテゴリ:スポンサー広告| コメント(-)

スポンサーサイト


上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
2012.02.22 01:50|カテゴリ:Perlコメント(0)

[Perl]でハイフンをぐるぐるしてみよう


ぐるぐる
Original Update by SigNote Cloud
 みなさんこんな経験ありませんか?

「このループ超長いから経過表示にピリオドでも出力すっか」

 長いループの処理の先頭で改行無しでピリオドを出力すればループ一回毎にピリオドが画面に表示されてプログレスバーみたいでわかりやすいじゃないか。ところがこれをやってみると、

「最後にどかっと、表示されます」( ̄□ ̄;)ガーン

 なんだこれ、ループが回ってる間は全然出力されないのに処理が終わったとたんにいきなり画面に全部表示されるじゃねーか! ということになり、

「プログレスバーがわりにピリオドなんて無理げー」

 という結論にいたってはいないでしょうか? 実はこれちゃんと原因があるんですよ。それが、

「バッファリング」

 とよばれる仕組みです。

 Perl からの出力は内部のメモリに蓄積されて、ある特定のタイミングで画面等に出力されます。その特定のタイミングというのが初期設定では、

「改行コードが出力されたとき」

 となっているのです。その為、ループの経過表示にちょっとずつ文字を連続出力したくても、画面には改行コードを出力したタイミングでまとめて表示されます。このバッファリング、バッファなんかしなくてすぐに出力されれば連続表示できるんじゃないの? というわけでこのバッファリングを止める方法があります。それが特殊変数、

「$|」

 の利用です。この特殊変数に「0」意外の数字を指定するとバッファリング処理がされずにすぐに文字が表示されるようになります。ということでさっそくやってみましょう。以下のソースを実行するとハイフンがぐるぐるまわっちゃうよー

kaiten.pl ※Mac OS X 10.6.8 及び Perl v5.10.0 にて動作確認
#!/usr/bin/perl
use strict;
use utf8;  #-ソースがUTF8だという宣言
use Time::HiRes 'sleep';
binmode STDOUT, ":utf8";  #-画面に出力したい文字コード
binmode STDERR, ":utf8";  #-エラー出力に使いたい文字コード
binmode STDIN, ":utf8";  #-標準入力から入ってくる文字コード
$| = 1;
for (0..10) {
	print "-";
	sleep(0.1);
	print "\r";
	print '\\';
	sleep(0.1);
	print "\r";
	print '|';
	sleep(0.1);
	print "\r";
	print '/';
	sleep(0.1);
	print "\r";
}
print "-\n";
exit;
コメントの投稿












管理者にだけ表示を許可する
トラックバック
この記事のトラックバックURL

プロフィール

ひらくん Author:ひらくん
どもども、ひらんくんどす。
日々まったり過ごしております。
仕事はDTP関連のスプリクト&アプリケーション開発。
Follow happyscript on Twitter

ブログ内検索



上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。