Должен ли я включать предупреждения Perl с помощью переключателя командной строки или прагмы?

StackOverflow https://stackoverflow.com/questions/221919

  •  03-07-2019
  •  | 
  •  

Вопрос

Есть ли разница между двумя приведенными ниже примерами запуска сценария 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';

Делай оба! Всегда!

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top