close関数 - ファイルハンドルを閉じる



  1. Perl




  2. 関数



  3. here

 ファイルハンドルを閉じるには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関数を呼び出します。



  1. Perl




  2. 関数



  3. here