warnings::warnif
从调用者的角度报告(如carp
,它在内部使用)。我希望它从本地调用框架的角度报告(如warn
)。虽然Carp
具有不从某些软件包的角度报告警告的机制,但似乎没有办法反向并告诉它应该从特定的角度报告。
或者,有没有办法让warnings::warnif
匹配warn
的行为不包括以换行符结尾的邮件的位置信息?我宁愿没有位置而不是误导性的。
我有一个使用warnings::register
的特定于应用程序的模块,以便我可以从主脚本控制其警告的处理。他们默认将它们提升为FATAL
,但用户可以覆盖它并“强制”程序继续。最初我在模块中使用die
并在主脚本中有条件地覆盖CORE::GLOBAL::die
来发出警告。我切换到warnings::register
,因为覆盖die
是严厉的,不灵活的,容易出错。
答案 0 :(得分:1)
die("msg") if warnings::fatal_enabled();
warn("msg") if warnings::enabled();
答案 1 :(得分:0)
ikegami的答案解决了这个问题,但需要为每条警告信息编写大量样板代码。如果Perl有宏,我们可以使用它们来摆脱样板,但它没有(尽管有源过滤器)。使用子例程会更改位置,但我们可以使用caller
来获取正确的位置,并模仿warn
/ die
的行为,将其添加到不会结束的邮件中换行符:
sub error {
unless ($_[-1] =~ /\n$/) {
my (undef, $file, $line) = caller;
push @_, " at $file line $line.\n";
}
die @_ if warnings::fatal_enabled();
warn @_ if warnings::enabled();
}