Perlゼミ

Perlでテキスト処理、Linuxサーバー管理、Webシステム開発
  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関数を呼び出します。

Perlの入門書
  • 初めてのPerl 第7版

    Perl入門 定番の一冊
  • 業務に役立つPerl

    ログ解析など日本語を含むテキスト処理の実践!
Twitter
Perlゼミの情報が役立ったら、フォロー、いいね、リツートで応援。