2
假設我有一個打開的文件句柄,或者任何我必須在退出腳本之前解決的問題。 我也有一個長循環,如果processus收到一個sigint,我想打破循環。什麼是最乾淨的方式來做到這一點?Perl,如何使用信號處理程序打破循環sub
下面是該問題的說明;
use sigtrap 'handler' => \&sigint_handler, 'INT';
sub sigint_handler {
print("\nI see you are trying to escape this evil infinite loop,
but there is nothing that I can do to help you :(\n");
}
my $the_developper_is_unable_to_end_this_mess = 1;
open(my $handle, "< some.important.file");
while($the_developper_is_unable_to_end_this_mess) {
print("And the evil loop rolls again and again...\n");
sleep(3);
}
close($handle);
print("everything went better than expected\n")
應該絕對運行可以被放入一個
END
塊
@derpness感謝您的建議編輯。每個循環設置處理程序確實是不需要的,但我想將其放在塊中以用於範圍目的。更好的解決方案應該是'{my $ run = 1;使用sigtrap ...; while($ run){...}}'。無論如何,這與代碼的主要目的是非常接近的,所以你的建議沒有被合併。 – amon
sigtrap和範圍的陳述是不正確的[從代碼的角度來看,可能(?)來自人類的理解]。添加: BEGIN {$ sigtrap :: Verbose = 1; }打印「正在運行\ n」; 到「my $ ...」之前,表明信號處理程序是在編譯時安裝的 - 由於使用語句。在這兩個例子中,它都會導致全球範圍內的信號處理。 – Mathew