Perl入門ゼミ

テキスト処理、Linuxサーバー管理、Web開発ならPerl
  1. Perl
  2. 標準関数
  3. here

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関数を呼び出します。

Giblog