Подтвердить что ты не робот

Почему следует использовать предупреждения; идти последний?

Я смутно помню, что прагма warnings должна оставаться последней в списке модулей, загружаемых с помощью use. Я также смутно помню, что это как-то связано с модулями, регистрирующими свои собственные категории предупреждений, но я не могу воспроизвести никаких проблем. Может ли кто-нибудь указать на соответствующую статью или показать пример, где расположение прагмы warnings имеет значение?

4b9b3361

Ответ 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.