У меня есть сценарий тестирования как это:
package Test;
sub new { bless {} }
sub DESTROY { print "in DESTROY\n" }
package main;
my $t = new Test;
sleep 10;
Деструктор называют после sleep
возвраты (и прежде чем программа завершается). Но это не называют, если сценарий завершается с Ctrl-C. Действительно ли возможно назвать деструктор в этом случае также?
Вам нужно будет настроить обработчик сигналов.
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
и выходит изящно.
Как упоминал Роберт , вам понадобится обработчик сигнала.
Если вам нужен только вызов деструктора объекта, вы можете использовать это:
$ SIG {INT} = sub {die "поймал SIGINT \ n"};
.