次のようなテスト スクリプトがあります。
package Test;
sub new { bless {} }
sub DESTROY { print "in DESTROY\n" }
package main;
my $t = new Test;
sleep 10;
デストラクタは、sleep
リターンの後 (およびプログラムが終了する前) に呼び出されます。ただし、スクリプトが Ctrl-C で終了した場合は呼び出されません。この場合もデストラクタを呼び出すことは可能ですか?
ロバートが述べたように、シグナルハンドラーが必要です。
必要なのがオブジェクトデストラクタ呼び出しだけの場合は、次を使用できます。
$SIG{INT} = sub { die "caught SIGINT\n" };
。
シグナルハンドラーを設定する必要があります。
package Test;
sub new { bless {} }
sub DESTROY { print "in DESTROY\n" }
package main;
my $terminate = 0;
$SIG{INT} = \&sigint;
sub sigint { $terminate = 1; }
my $t = new Test;
while (1) {
last if $terminate;
sleep 10;
}
これらの線に沿った何か。次に、メインループでチェック$terminate
し、設定されているかどうかをプログラムを正常に終了します。
何が起こるかというと、cntl-cがスリープを中断し、シグナルハンドラーが設定と呼ばれ$terminate
、スリープがすぐに戻り、トップにループし、テスト$terminate
して正常に終了します。