ファイルハンドルの概念を理解する
Perlにおけるファイルハンドルの概念はややこしいので、解説しておきます。
ファイルハンドルは実体ではなくて概念的なもの
Perlでファイルハンドルといった場合は、Perlがファイルハンドルとして認識する複数の実体のことをいっています。ファイルハンドルという実体があるわけではないのです。
Perlが、ファイルハンドルとして認識するもの
- シンボル( FH )
- 型グロブ( *FH )
- 型グロブへのリファレンス( \*FH )
- IO::Handleクラスのオブジェクト
- IO::Handleオブジェクトを継承したクラスのオブジェクト( IO::File など )
Perlが、ファイルハンドルとして認識するものは、上記の5つです。以下の記述はすべて有効です。
# 1. シンボル FH open(FH, "<", $file) or die "$!"; # 2. 型グロブ *FH open(*FH, "<", $file) or die "$!"; # 3. 型グロブへのリファレンス \*FH my $fh = \*FH; open($fh, "<", $file) or die "$!"; # 4. IO::Handleオブジェクト use IO::Handle; my $fh = IO::Handle->new; open( $fh, "<", $file ) or die "$!"; # 5. IO::Fileオブジェクト( IO::Handleを継承 ) use IO::File; my $fh = IO::File->new; open($fh, "<", $file) or die "$!";
現代的なファイルオープンの書き方
現代的なファイルオープンの書き方は、
open(my $fh, "<", $file) or die "Can't open file $file:$!";
です。
未定義のスカラー変数がopen関数の第一引数に渡されると、無名型グロブへのリファレンスが自動的に生成されます。「3.型グロブへのリファレンス( \*FH )」と同じ記述で、my $fh = \*FH; の部分を自動的に行っているだけです。(これは、Perlの現代の実装で、将来的にはIO::Handleへのオブジェクトを自動生成するようになるかもしれません。)