Что такое «когда-то» предупреждения в Perl? - PullRequest
0 голосов
/ 05 ноября 2019

У меня есть код, который имеет,

no warnings 'once';

Чтение man warnings Я не вижу вхождения /once/ Что это делает?

Ответы [ 2 ]

3 голосов
/ 05 ноября 2019

Пока у вас нет strict, perl позволяет вам использовать переменную, не объявляя ее.

perl -wE'$foo = 4;'

Какие выходные данные

Имя main::foo используется только один раз: возможная опечатка в -e строке 1.

Примечание под strict это даже не будет разрешено,

Глобальный символ $foo требует явного имени пакета (вы забыли объявить my $foo?) в строке -e 1.

Вы можете отключить предупреждение, не включая strict с помощьюделать no warnings "once"; Хотя я бы настоятельно рекомендовал просто удалить неиспользуемый код вместо того, чтобы отключить предупреждение.

perl -wE'no warnings "once"; $foo = 4;'

Что и выглядит ужасно, и ничего не делает.

2 голосов
/ 06 ноября 2019

Если вы выполните следующее, вы получите предупреждение, плюс небольшое дополнительное объяснение:

perl -Mdiagnostics -Mwarnings -e '$foo=1'

Вывод будет:

Name "main::foo" used only once: possible typo at -e line 1 (#1)
    (W once) Typographical errors often show up as unique variable names.
    If you had a good reason for having a unique name, then just mention it
    again somehow to suppress the message.  The our declaration is
    provided for this purpose.

    NOTE: This warning detects symbols that have been used only once so $c, @c,
    %c, *c, &c, sub c{}, c(), and c (the filehandle or format) are considered
    the same; if a program uses $c only once but also uses any of the others it

Предупреждение относится к записям таблицы символов(не "мои" лексические переменные). Если вы добавите -Mstrict к вышеприведенному, вы создадите строгое нарушение, потому что ваша переменная нарушает strict 'vars', что запрещает вам использовать переменную, которая не была объявлена, за исключением глобальных пакетов, на которые ссылаются ихквалифицированное имя. Если вы предварительно объявите $foo с our, предупреждение исчезнет:

perl -Mdiagnostics -Mwarnings -Mstrict=vars -E 'our $foo=1'

Это работает просто отлично;это позволяет избежать строгого нарушения и избежать предупреждения «один раз». Таким образом, цель предупреждения состоит в том, чтобы предупредить вас об использовании идентификаторов, которые не объявлены, не используют полное имя, а также используются только один раз. Цель состоит в том, чтобы помочь предотвратить опечатки в именах символов, предполагая, что, если вы используете имя символа только один раз и не объявили его, это может быть ошибкой.

Специальные (пунктуация) переменные освобождаются от этогопроверить. Поэтому вы можете ссылаться на $_ или $/ только один раз и не вызывать предупреждение. Кроме того, $a и $b освобождены, поскольку они считаются специальными для использования в sort {$a <=> $b} @list;в таких конструкциях они могут появляться только один раз, но было бы бесполезно выдавать предупреждение за довольно типичный код.

Вы можете найти предупреждение «единожды», указанное в иерархии предупреждений здесь: предупреждения perldoc .

Список всех диагностических пометок доступен в perldoc perldiag .

...