发出警告,通常通过将其打印到 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
有关设置 %SIG
条目以及更多示例的详细信息,请参阅 perlvar。有关使用其 carp
和 cluck
函数的其他类型的警告,请参阅 Carp 模块。