Я смутно помню, что прагма warnings
должна оставаться последней в списке модулей, загружаемых с помощью use
. Я также смутно помню, что это как-то связано с модулями, регистрирующими свои собственные категории предупреждений, но я не могу воспроизвести никаких проблем. Может ли кто-нибудь указать на соответствующую статью или показать пример, где расположение прагмы warnings
имеет значение?
Почему следует использовать предупреждения; идти последний?
Ответ 1
Это может быть то, что вы имеете в виду. В любом случае это что-то, что нужно знать, и я представляю это как ошибку. Редактировать Ошибка была исправлена в v5.27.6.
Мой /Warnings.pm
package My::Warnings;
use warnings::register;
sub test {
warnings::warnif 'This is my warning';
}
1;
main.pl
use strict;
use feature 'switch';
use warnings 'all';
use My::Warnings;
print undef;
given (1) { }
My::Warnings::test();
Как и ожидалось, это будет выводить
given is experimental at E:\Perl\source\main.pl line 10.
Use of uninitialized value in print at E:\Perl\source\main.pl line 8.
This is my warning at E:\Perl\source\main.pl line 12.
Однако, если какая-либо категория предупреждений отключена, она также отключит пользовательскую категорию. Как это
use strict;
use feature 'switch';
use warnings 'all';
no warnings 'experimental';
use My::Warnings;
print undef;
given (1) { }
My::Warnings::test();
Это выводит только
Use of uninitialized value in print at E:\Perl\source\main.pl line 9.
и кажется необходимым включить предупреждения после use My::Warnings
чтобы заставить их работать
use strict;
use feature 'switch';
use My::Warnings;
use warnings 'all';
no warnings 'experimental';
print undef;
given (1) { }
My::Warnings::test();
Производит
Use of uninitialized value in print at E:\Perl\source\main.pl line 9.
This is my warning at E:\Perl\source\main.pl line 13.
Обновить
Более того, повторное включение категории, которая отключила пользовательские предупреждения, оставляет их отключенными
Что-то вроде этого
use strict;
use feature 'switch';
use warnings 'all';
no warnings 'experimental';
use warnings 'experimental';
use My::Warnings;
print undef;
given (1) { }
My::Warnings::test();
печатает просто
given is experimental at E:\Perl\source\main.pl line 12.
Use of uninitialized value in print at E:\Perl\source\main.pl line 10.