1
我在我的Perl程序中使用了use strict
,但這些錯誤並沒有像他們所能提供的那樣有用,因爲他們只列出了單一的違規行。當嚴格使用失敗時,有沒有辦法獲得回溯?我們可以在Perl中獲得嚴格的refs違規堆棧跟蹤嗎?
我在我的Perl程序中使用了use strict
,但這些錯誤並沒有像他們所能提供的那樣有用,因爲他們只列出了單一的違規行。當嚴格使用失敗時,有沒有辦法獲得回溯?我們可以在Perl中獲得嚴格的refs違規堆棧跟蹤嗎?
的strict
編譯包含禁止裸字的類別subs
和vars
這需要你聲明的所有變量。那些是編譯時間錯誤。這些堆棧跟蹤沒有幫助,因爲它們直接源自該行的源代碼。
strict
類別refs
禁止字符串作爲參考,這是運行時錯誤。這裏一個堆棧跟蹤可能有助於找出字符串來自哪裏。
獲取堆棧跟蹤的一種方法是use Carp::Always
(或作爲命令行標誌:-MCarp::Always
)。這會修改所有錯誤和警告以包含堆棧跟蹤。因爲它使所有錯誤更長,所以最好只將它用作調試幫助。
如果您遇到子例程無效參數的問題,那麼驗證輸入可能會更好。例如爲:
use Carp;
sub foo {
my ($ref) = @_;
# dies from the line where "foo()" was called
croak q(Argument "ref" must be a scalar reference)
unless ref $ref eq 'SCALAR' or ref $ref eq 'REF';
do_something_with($$ref);
}
當使用從Carp
(例如croak()
或confess()
)可以強制堆棧跟蹤的功能之一通過添加Perl的選項-MCarp=verbose
。
'鯉魚:: cluck'和'鯉魚:: confess'總是輸出堆棧軌跡。 – mob