warn LIST

发出警告,通常通过将其打印到 STDERRwarn 以与 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。有关使用其 carpcluck 函数的其他类型的警告,请参阅 Carp 模块。