發出警告,通常會將其列印到 STDERR
。warn
以與 die
相同的方式詮釋其運算元 LIST,但當 LIST 為空或產生空字串時,其預設值略有不同。如果它為空且 $@
已包含例外值,則會在附加 "\t...caught"
之後使用該值。如果它為空且 $@
也為空,則會使用字串 "Warning: Something's wrong"
。
預設情況下,會將從運算元 LIST 衍生的例外轉換為字串並列印到 STDERR
。可以透過安裝 $SIG{__WARN__}
處理常式來變更此行為。如果存在此類處理常式,則不會自動列印任何訊息;處理常式有責任以其認為合適的方式處理例外(例如,將其轉換為 die
)。因此,大多數處理常式都必須安排實際顯示他們不準備處理的警告,方法是在處理常式中再次呼叫 warn
。請注意,這非常安全,不會產生無限迴圈,因為不會從其中呼叫 __WARN__
鉤子。
您會發現此行為與 $SIG{__DIE__}
處理常式略有不同(後者並不會抑制錯誤文字,但可以再次呼叫 die
來變更錯誤文字)。
使用 __WARN__
處理常式提供了一個強大的方式來讓所有警告(甚至所謂的強制警告)保持沉默。範例
# wipe out *all* compile-time warnings
BEGIN { $SIG{'__WARN__'} = sub { warn $_[0] if $DOWARN } }
my $foo = 10;
my $foo = 20; # no warning about duplicate my $foo,
# but hey, you asked for it!
# no compile-time or run-time warnings before here
$DOWARN = 1;
# run-time warnings enabled after here
warn "\$foo is alive and $foo!"; # does show up
請參閱 perlvar 以取得有關設定 %SIG
項目的詳細資料和更多範例。請參閱 Carp 模組以取得使用其 carp
和 cluck
函數的其他種類警告。