デストラクタ - DESTROY
Perlはリファレンスカウント方式のGCを持つプログラミング言語です。オブジェクトが解放されるのは、リファレンスカウントが0になった場合です。
DESTROYというメソッドを実装することで、リファレンスカウントが0になるタイミングで、デストラクタを実行することができます。
sub DESTROY { # オブジェクトが解放されるときに実行される処理 ... }
ファイルハンドルをデストラクタでクローズする
たとえば、ファイルを表現するFileクラスがあったとします。Fileクラスはfhフィールドに、open関数でオープンしたファイルハンドルを保存しています。
これを、オブジェクトを開放するタイミングでclose関数を使ってクローズしたいとします。
そのような場合、次のようにデストラクタを記述します。
package File; use Carp 'croak'; # コンストラクタ sub new { my ($class, $file) = @_; my $self = {}; open my $fh, '<', $file or croak "Can't open $file: $!"; $self->{fh} = $fh; return bless $self, $class; } # デストラクタ sub DESTROY { my $self = shift; print "DESTROY"; close $self->{fh}; } package main; { my $file = File->new('a.txt'); }
参考: オブジェクト指向、Carpモジュール、スコープ、mainパッケージ
このスクリプトを実行すると「DESTROY」と表示されますが、これは、デストラクタが実行されていることを確認するために入れたものです。デストラクタが実行されており、ファイルハンドルはクローズされます。
デストラクタの主な用途
デストラクタが利用されることが多いのは、ファイルやデータベースなどの外部リソースをクローズするときです。Perlはオブジェクトが解放されるタイミングが明確なので、デストラクタ内でリソースのクローズ処理を書いておくことができます。