Perl 「 ファイルハンドル 」とは何か (0x41)

セラ (perlackline)

2013年11月26日 20:04



目次 - Perl Index



Theme



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

Perl のファイルハンドルについて。




ファイルハンドルとは



ファイルハンドル ( Filehandle ) とは、ファイル ( File ) とハンドル ( Handle ) が組み合わさった用語です。

英語の「 Handle 」は、「 取っ手 」や「 柄 」等と同時に、「 扱う 」、「 操作 」すると言った意味を持っています。

このことから、「 ファイルハンドル 」はファイルを操作する機能を意味するものとなります。

具体的には、Perl プログラムのプロセスと、その外部のファイルの結びつき ( I/O コネクション ) に対して、Perl プログラム側で指定する名前のことをファイルハンドルと呼びます。

つまり、ファイルハンドルは、ファイルそのものの名前ではなくて、その結びつき ( コネクション ) に付けられた名前を持ってファイルのデータを操作しようとするものです。

素朴に考えれば、ファイル名そのものを指定すれば良いのではないかとも思えますが、実際にはそうではないということです。

ファイルハンドルの名前



ファイルハンドルには、「 Perl 識別子, 変数名 (0x09) 」で確認した文字を識別子として利用出来ますが、Perl の父 Larry wall は大文字のみの識別子を推奨しています。

それは、未来の予約語との衝突を回避するための手段です。

特別な 6 つのファイルハンドル



Perl には、予め予約された特別なファイルハンドルが 6 つ存在します。ユーザはこれらの文字列を独自の用法で利用することは出来ません。特別な 6 つのファイルハンドルは次の通りです。

STDIN
STDOUT
STDERR
DATA
ARGV
ARGVOUT


この中で、「 STDIN 」「 STDOUT 」「 STDERR 」は「 Perl 標準出力と print 関数の序 (0x03) 」で確認したものと (ほとんど) 同等の意味を持っています。

「 STDIN 」に関しては、「 Perl STDIN でキーボードから入力を受け付ける それと chomp 演算子 (0x16) 」で既に利用しています。

ARGV 」は、「 Perl 「 I/O 」: 起動引数と @ARGV (0x3b) 」で、プログラムの引数を受け取る配列として確認しました。

つまり、(おそらくは) ダイヤモンド演算子「 <> 」で読み込んだファイルを示すハンドルだと言うことです。

ARGVOUT 」は、スイッチ「 -i 」を利用した時に、現在開いている "出力" ファイルを示すファイルハンドルだとのことです。

「 ARGV 」が "入力" ファイルを示すことと、ちょうど反対の意味を持っています。詳細は、スイッチ「 -i 」について調べてみてください。

DATA 」は、ちょっと変わったファイルハンドルです。次の様に使います。


while (<DATA>) {
print $_;
}
__DATA__
Do you show this line ?


「 <> 」に「 DATA 」を指定してデータを読み込んでいます。読み込まれるデータは「 __DATA__ 」以降の文字列です。

実行結果は次の様になります。


Do you show this line ?


プログラムの 1 行目、「 <DATA> 」で「 __DATA__ 」以降の文字列を読み込んで、2 行目の print 文でその内容を表示しています。

つまり、「 __DATA__ 」以降の情報は、Perl のプログラムとしてではなく、ファイルハンドルに入力される情報 ( Data ) として解釈されます。

0x41 -> 0x42 へ



最後に紹介したファイルハンドルの「 __DATA__ 」というトークンは、「 __END__ 」と似通った動作をします。

今回紹介したプログラムであれば、「 __DATA__ 」の代わりに 「 __END__ 」を指定しても差し支えはありません。

しかしながら、もう少しステップアップしたプログラムを組み始めると、その違いをしっかり把握しておく必要が出てくるはずです。興味のある人は調べてみてください。

次回もファイルハンドルについてを継続します。

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

目次 - Perl Index




















関連記事