Perl Perl_0
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 mp2 翻訳 Web コンテンツ圧縮の FAQ (d228)
Perl mp2 翻訳 既知のブラウザのバグの回避策をいくつか (d227)
Perl mp2 翻訳 Perl と Apache でのキュートなトリック (d226)
Perl mp2 翻訳 テンプレートシステムの選択 (d225)
Perl mp2 翻訳 大規模 E コマースサイトの構築 (d224)
Perl mp2 翻訳 チュートリアル (d223)
Perl mp2 翻訳 既知のブラウザのバグの回避策をいくつか (d227)
Perl mp2 翻訳 Perl と Apache でのキュートなトリック (d226)
Perl mp2 翻訳 テンプレートシステムの選択 (d225)
Perl mp2 翻訳 大規模 E コマースサイトの構築 (d224)
Perl mp2 翻訳 チュートリアル (d223)