2017-02-09 79 views
7

我試圖做這樣的事情如何知道哪些是正在執行的代碼行當接收

$SIG{ALRM} = sub { 
    print $line_number_when_alarm_went_off; 
}; 

alarm 10; 

# rest of the script 

我使用ALRM作爲信號。例如,我最終會使用不同的從外面殺掉信號來觸發它。做這種手術有沒有一種簡潔的方式?

我有一些緩慢的腳本,有時我想向他們發送一個信號,知道當時的代碼在哪裏。

我希望儘可能不顯眼,這樣我就可以打包並將其添加到舊代碼中。

+5

聽起來好像你正在重塑分析。你有沒有試過[Devel :: NYTProf](https://metacpan.org/pod/Devel::NYTProf)? – AKHolland

+6

只需在信號處理程序中調用'Carp :: cluck'並獲取整個堆棧跟蹤。 – mob

+0

cluck也可以工作。我以前曾經承認過,但那並沒有奏效,對我來說並沒有發生過嘗試。 – Nullman

回答

7

您可以在列表上下文中使用caller來獲取調用當前子項的位置的包,文件和行號。

$SIG{ALRM} = sub { 
    my ($pkg, $file, $line) = caller; 

    CORE::say $line; 
    die; 
}; 

alarm 2; 

while (1) { 
    1; 
} 

這將輸出11(如果我算正常,在我的文件是1740,而$SIG線是1730

它還可以與其它信號處理程序,就像warn

$SIG{__WARN__} = sub { 
    my ($pkg, $file, $line) = caller; 

    CORE::say $line; 
}; 

warn 'foo'; 

這將輸出7

請注意,您的代碼有語法錯誤。一個散列參考作爲信號處理程序,不是子參考

+0

我一直在谷歌搜索幾個小時,不知何故來電者從未彈出。這正是我所期待的,謝謝! 什麼是哈希引用? sub {...}返回一個子引用,這段代碼適用於我 – Nullman

+0

@null也許你需要獲得更多Google foo :-)我首先想到'__LINE__',但顯然有當前行。所以這個解決方案變得明顯 – simbabque

+0

啊,我看到我的問題被編輯了。你是對的!我錯過了「子」部分! – Nullman

相關問題