blog20100901

2013/08/20 - プログラミング言語 Perl にまつわる etc. - Perl monger
参考 : perldoc, perldoc.jp, search.cpan.org, perldoc.perl.org ...
「 初めての Perl 第 6 版 」(オライリー・ジャパン発行 ISBN978-4-87311-567-2) 」
「 続・初めての Perl 改訂版 」(オライリー・ジャパン発行 ISBN4-87311-305-9) 」
「 Effective Perl 第 2 版 」(翔泳社発行 ISBN978-4-7981-3981-4) 」 ... etc,.

Perl Perl_0

Perl 「 ファイルハンドル 」: select 演算子と特殊変数 "$|" (0x4b)

Perl 「 ファイルハンドル 」: select 演算子と特殊変数 $|  (0x4b)

目次 - Perl Index



Theme



Perl について、復習を兼ねて断片的な情報を掲載して行く連載その 0x4b 回。

Perl の標準出力へのファイルハンドルを任意に選択する「 select 」演算子と、出力バッファを制御する「 $| 」について。




select 演算子



Perl では、「 select 」演算子を利用することで、標準出力のコネクションを変更することが出来ます。

「 select 」演算子の書式は次の通りです。


select FILEHANDLE
select


select の動作を確認する



「 FILEHANDLE 」には、出力モードのファイルハンドルを任意に指定出来ます。例えば次の様に。


open FILEOUT, '>>', 'output_file"; # 出力モードのファイルハンドルを open

select FILEOUT; # 標準出力に FILEOUT をセット

print; # $_ の内容を FILEOUT に出力

select STDOUT; # 標準出力を STDOUT に戻す
close FILEOUT; # ファイルハンドルを close


1 行目で、出力モードのファイルハンドル「 FILEOUT 」を開いています。そのコネクションはファイル「 output_file 」に繋がれています。

3 行目では、selecet 演算子を使い、標準出力を「 FILEOUT 」に変更しています。

5 行目には、動作を確認するための print 文を置きました。引数のない print は、デフォルトのスカラ変数「 $_ 」を出力しますので、ファイル「 output_file 」には、「 $_ 」の内容が書き込まれます。

7 行目で、標準出力をデフォルトの「 STDOUT 」に戻しています。このままプログラムが終わるなら特に戻す必要はないですが、8 行目の close と同様に、なるだけ綺麗に終わらせる様に癖付けています。

ファイルハンドルを指定しない select



select 演算子で、引数「 FILEHANDLE 」を指定しない場合は、現在選択されているファイルハンドルが返されます。


print select;


上記の様に、特に何もセレクトしていない状態では、次の様に表示されます。出力先はもちろん「 STDOUT 」です。


main::STDOUT


今度は、出力モードで open したファイルハンドル「 FILEOUT 」をセレクトしたものを見てみます。


open FILEOUT, '>>', 'output_file";

select FILEOUT;

print select;


このケースでは、print 関数の出力先が「 STDOUT 」から「 FILEOUT 」のコネクションに変更されているため、標準出力であるモニタ上には何も表示されません。

その代わりに、「 FILEOUT 」が出力モードでコネクションを持っている、ファイル「 output_file 」に次の内容が書き込まれます。


main::FILEOUT


この機能の使いどころがよく理解出来ていないのですが、どうやら、ファイルハンドルのバッファリングをコントロールする際に有用らしい、という様なことが書いてありました。

バッファリング



バッファリングとは、バッファ ( Buffer ) することです。「 Buffer 」は「 緩衝する 」という意味で、コンピュータの世界では、処理速度や転送速度の差を吸収するために一時的にデータを留めて置くことを意味します。

例えば、インターネット等で動画等の大きなデータを読み込む時は、大抵「 待ち 」時間が発生しますが、この「 待ち 」時間は、データをバッファに溜める (バッファリングする) ために発生しています。

反対に受け取ったデータを、逐次出力するのはバッファリングをしていないことになります。

仮に、インターネット等で動画等を読み込む場合に、バッファリングをしていなければ、コンテンツのスムーズな表示は難しいかもしれません。

この様に、通常はバッファリングをした方が快適で、効率の良い資源の利用が期待できます。

しかしながら、ある特定の状況では、バッファリングをしない方が目的に沿うケースがあると言います。

それは例えば、リモートのシェル上で Perl スクリプトを実行し、その実行状況を確認したい場合や、長々としたログ (記録) データを出力する場合です。

今の僕には、その効果がぼんやりとしか掴めていませんが、場数とともに馴染んで行くことでしょう。

$| で強制的にフラッシュする



バッファリングをする / しない、のいずれにせよ、出力先 (出力チャネル) にデータを放出することを「 フラッシュ 」すると言います。

Perl では、予め用意された特殊な変数「 $| 」を設定することで、出力チャネルにバッファされた、あるいは、バッファされようとしているデータを、直ちにフラッシュすることが出来ます。

強制的なデータのフラッシュをするためには、「 $| 」に対して 0 以外 ( 通常は 1 ) を指定します。


select FILEOUT;
$| = 1; # これで、FILEOUT のバッファにはデータが溜まらない


もちろん「 $| 」は、「 STDOUT 」や「 STDERR 」に対しても使うことが出来ます。「 $| 」の本領は、Perl の I/O (入出力) を高度に利用し始めて、初めて理解出来るものの様に感じます。

「 $| 」、それはつまり、「 パイプをホットな状態にしておく 」もの。だそうです。

0x4b -> 0x4c へ



select 演算子には、「 select(2) 」というバージョンがあり、その書式は次の様になっています。


select RBITS, WBITS, EBITS, TIMEOUT


これは、select のシステムコールをビットマスクを指定して呼び出す機能です。

「 RBITS 」が読み込み (Read)、「 WBITS 」が書き込み (Write)、「 EBITS 」がエラー (Error) のビットマスクを表すそうです。

「 TIMEOUT 」は、その名の通り、タイムアウトまでの時間を指定します。ミリ秒単位で指定出来るそうです。

これらは通常、入出力を多重化する際に有用とのことですが、今の僕には遠い世界の物語です。

参考情報は書籍「 初めての Perl 第 6 版 」を中心に perldoc, Wikipedia および各 Web サイト。それと詳しい先輩。

目次 - Perl Index





















同じカテゴリー(Perl)の記事
 Perl mp2 翻訳 Web コンテンツ圧縮の FAQ (d228) (2023-10-11 23:49)
 Perl mp2 翻訳 既知のブラウザのバグの回避策をいくつか (d227) (2023-05-26 15:41)
 Perl mp2 翻訳 Perl と Apache でのキュートなトリック (d226) (2023-05-19 17:05)
 Perl mp2 翻訳 テンプレートシステムの選択 (d225) (2022-08-15 22:23)
 Perl mp2 翻訳 大規模 E コマースサイトの構築 (d224) (2022-06-15 20:43)
 Perl mp2 翻訳 チュートリアル (d223) (2022-06-15 20:42)

Llama
リャマ
TI-DA
てぃーだブログ
プロフィール
セラ (perlackline)
セラ (perlackline)
QRコード
QRCODE
オーナーへメッセージ

PAGE TOP ▲