Должен ли я включать предупреждения Perl с помощью переключателя командной строки или прагмы?
Вопрос
Есть ли разница между двумя приведенными ниже примерами запуска сценария Perl?Если да, то когда я буду использовать один вместо другого?
пример 1:
#!/usr/bin/perl
use warnings;
пример 2:
#!/usr/bin/perl -w
Решение
Использование переключателя включит все предупреждения во всех модулях, используемых вашей программой. Используя прагму, вы включаете ее только в этом конкретном модуле (или скрипте). В идеале вы используете предупреждения во всех своих модулях, но часто это не так. Использование этого переключателя может привести к множеству предупреждений при использовании стороннего модуля, который не является безопасным для предупреждений.
Итак, в идеале это не имеет значения, но, прагматически, для ваших конечных пользователей часто предпочтительнее использовать не переключатель, а прагму.
Другие советы
Переключатель командной строки -w
включает глобальные предупреждения для всего интерпретатора. С другой стороны, use warnings
является «лексической прагмой»; и применяется только в лексической области, в которой он используется. Обычно вы помещаете это в верхнюю часть файла, чтобы оно относилось ко всему файлу, но вы также можете ограничить его определенными блоками. Кроме того, вы можете использовать no warnings
, чтобы временно отключить их внутри блока, в тех случаях, когда вам необходимо выполнить поведение, генерирующее предупреждения в противном случае. Вы не можете сделать это, если у вас есть -w
. Р>
Подробнее о том, как работают лексические предупреждения, в том числе о том, как включать и выключать их различные подмножества, см. в документ perllexwarn . Р>
«-w» старше и раньше был единственным способом включить предупреждения (на самом деле «-w» просто включает глобальную переменную $^W).«Используйте предупреждения;» теперь предпочтительнее (начиная с версии 5.6.0 и позже), потому что (как уже упоминалось), она имеет лексическую вместо глобальной масштаба, и вы можете включить/выключить конкретные предупреждения.И не забудьте также начать с «Использовать строгих»; :-)
Еще одно различие, на которое стоит обратить внимание, это то, что " использовать предупреждения " Прагма также позволяет вам выбрать конкретные предупреждения для включения (а также, «без предупреждений» позволяет выбирать предупреждения для отключения).
Помимо включения / выключения определенных утверждений с помощью прагмы, вы также можете рекламировать некоторые или все предупреждения об ошибках:
use strict;
use warnings FATAL => 'all', NONFATAL => 'exec';
Делай оба! Всегда!