2010-04-13 14 views
7

मेरे पास इस तरह की एक टेस्ट स्क्रिप्ट है:ऑब्जेक्ट विनाशक को स्क्रिप्ट समाप्त होने पर क्यों नहीं कहा जाता है?

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

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

विनाशक sleep रिटर्न के बाद कहा जाता है (और कार्यक्रम समाप्त होने से पहले)। लेकिन यह नहीं कहा जाता है कि स्क्रिप्ट को Ctrl-C के साथ समाप्त कर दिया गया है या नहीं। क्या इस मामले में भी विनाशक को बुलाया जा सकता है?

उत्तर

6

आपको सिग्नल हैंडलर सेट करना होगा।

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-सी नींद में व्यवधान, संकेत हैंडलर की स्थापना $terminate, सो रिटर्न तुरंत, यह शीर्ष करने के लिए लूप कहा जाता है $terminate परीक्षण करता है और शान से बाहर निकालता है।

7

रॉबर्ट mentioned के रूप में, आपको सिग्नल हैंडलर की आवश्यकता है।
यदि आपको ऑब्जेक्ट डिस्ट्रक्टर कॉल की आवश्यकता है, तो आप इसका उपयोग कर सकते हैं:

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

संबंधित मुद्दे