Я знаю, как use warnings::register
создавать собственные категории предупреждений для моего модуля. Однако, если я создаю категорию предупреждений Module::category
и предупреждаю с помощью warnif()
, no warnings 'Module'
не подавляет предупреждения. Как я могу кратко проверить и Module::category
и Module
?
MCVE
package Provider;
use strict; use warnings;
use warnings::register qw(undefined);
sub foo {
warnings::warnif('Provider::undefined', "Undefined parameter!");
}
package Consumer;
use strict; use warnings;
Provider::foo; # warns - OK
{
no warnings 'Provider::undefined';
Provider::foo; # does not warn - OK
}
{
no warnings 'Provider';
Provider::foo; # _DOES_ warn - oops <===========
}
Другое расследование
Если я проверяю состояние предупреждений внутри Provider::foo()
, я вижу, что no warnings 'Provider'
не касается Provider::undefined
:
sub foo {
print "$_: @{[warnings::enabled($_) ? 'enabled' : 'disabled']}\n"
foreach qw(Provider::undefined Provider);
}
дает
Provider::undefined: enabled
Provider: enabled
Provider::undefined: disabled
Provider: enabled
Provider::undefined: enabled
Provider: disabled
для трех тестов, приведенных выше.
Обходной путь
sub foo {
my $should_warn = 1;
foreach (qw(Provider::undefined Provider)) {
if(!warnings::enabled($_)) {
$should_warn = 0;
last;
}
}
warnings::warn('Provider::undefined', "Undefined parameter!")
if $should_warn;
}
... но перед тем, как обернуть это в модуль и поместить его в CPAN, я бы хотел узнать, сделал ли это кто-нибудь еще или знает лучший способ :). Поиск в Google и SO был недоступен.