close関数 - ファイルハンドルを閉じる
ファイルハンドルを閉じるにはclose関数を使用します。
close $fh;
もう少し詳しく書くと、close関数が呼ばれると、現在のバッファがフラッシュされて、その後にファイルハンドルが閉じられます。
close関数でファイルハンドルを閉じる必要はあるか
open関数で、ファイルオープンをした後に、close関数でファイルハンドルを閉じる必要はあるでしょうか。必ずしも必要ではありません。
一般的には、次のようにファイルをオープンします。
open(my $fh, '<', $file);
「$fh」はレキシカル変数です。そして、スコープが終われば、レキシカル変数は解放されます。そして、解放されるタイミングで、自動的にclose関数が呼び出されます。ファイルもひとつのスコープです。ですから、レキシカル変数にファイルハンドルが代入されている場合は、close関数を呼び出す必要は通常はありません。
close関数を使用する必要がある場合のいつくかの例を書いておきます。
型グロブやシンボルに、ファイルハンドルを代入した場合
ファイルハンドルは、型グロブやファイルハンドルに代入することもできます。古いソースコードでは、次のようなopenはよく見ると思います。
# 型グロブ open(*FH, '<', $file) # シンボル open(FH, '<', $file)
このような場合は、明示的にcloseしないと、スコープが終わってもファイルハンドルが開きっぱなしになるので、closeしてあげましょう。短いプログラムで、プログラムがすぐに終了する場合は、グローバルデストラクションで、ファイルが閉じられるので、closeしないでもよいですが、しておいたほうが無難でしょう。
すぐにバッファをフラッシュして、ファイルハンドルを閉じたい場合
close関数は、バッファをフラッシュしてから、ファイルハンドルを閉じます。バッファというのは、まだファイルに書き込まれていないデータのことです。
書き込みモードで、ファイルハンドルを開いて、print関数で、データを書き込んだとします。けれども、このデータはすぐには書き込まれずに、バッファに蓄積にされます。これは効率のためです。一定のバッファが蓄積された後に、書き込まれるという動作をします。
このような場合に、すぐにフラッシュしたい場合は、close関数を使うとよいでしょう。
パイプやソケットなどを開いて、明示的に閉じる必要がある場合
forkとopen関数を使って、複数のパイプやソケットなどを開いた場合は、書き込み側だけ、あるいは、読み込み側だけ、閉じたいという場合があると思います。そういう場合は、明示的にclose関数を呼び出します。