2010-04-13 20 views
7

Tengo un script de prueba como esta:¿Por qué no se llama al destructor de objetos cuando finaliza el script?

package Test; 
sub new { bless {} } 
sub DESTROY { print "in DESTROY\n" } 

package main; 
my $t = new Test; 
sleep 10; 

se llama al destructor después sleep rendimientos (y antes de que termine el programa). Pero no se llama si el script termina con Ctrl-C. ¿Es posible que también se llame al destructor en este caso?

Respuesta

6

Tendrá que configurar un controlador de señal.

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; 
} 

Algo en esta línea. Luego, en su ciclo principal simplemente marque $terminate y, si está configurado, salga del programa normalmente.

Lo que sucede es que el cntl-c interrumpe el sueño, el manejador de señal se llama configuración $terminate, el sueño regresa inmediatamente, se repite en la parte superior, prueba $terminate y sale con gracia.

7

Como Robert mentioned, necesita un manejador de señal.
Si todo lo que necesita es la llamada al destructor de objetos, puede usar esto:

$SIG{INT} = sub { die "caught SIGINT\n" };.

Cuestiones relacionadas