Стоит ли включать предупреждения Perl с помощью параметра командной строки или прагмы? - PullRequest
15 голосов
/ 21 октября 2008

Есть ли разница между двумя примерами ниже для запуска сценария Perl? Если да, то когда бы я использовал один поверх другого?

пример 1:

#!/usr/bin/perl

use warnings;

пример 2:

#!/usr/bin/perl -w

Ответы [ 6 ]

31 голосов
/ 21 октября 2008

Использование переключателя включит все предупреждения в всех модулях, используемых вашей программой. Используя прагму, вы включаете ее только в этом конкретном модуле (или скрипте). В идеале вы используете предупреждения во всех своих модулях, но часто это не так. Использование коммутатора может получить много предупреждений при использовании стороннего модуля, который не является безопасным для предупреждений.

Итак, в идеале это не имеет значения, но, прагматично, для ваших конечных пользователей часто предпочтительнее использовать не коммутатор, а прагму.

17 голосов
/ 21 октября 2008

Переключатель командной строки -w включает глобальные предупреждения для всего интерпретатора. С другой стороны, use warnings является «лексической прагмой» и применяется только в той лексической области, в которой он используется. Обычно вы помещаете это в верхнюю часть файла, чтобы оно относилось ко всему файлу, но вы также можете ограничить его определенными блоками. Кроме того, вы можете использовать no warnings, чтобы временно отключить их внутри блока, в тех случаях, когда вам необходимо выполнить иначе генерирующее предупреждение поведение. Вы не можете сделать это, если у вас есть -w.

Подробнее о том, как работают лексические предупреждения, в том числе о том, как включать и выключать их различные подмножества, см. В документе perllexwarn .

10 голосов
/ 21 октября 2008

"- w" старше и раньше был единственным способом включения предупреждений (на самом деле "-w" просто включает глобальную переменную $ ^ W). «использовать предупреждения;» теперь предпочтительнее (начиная с версии 5.6.0 и выше), потому что (как уже упоминалось) имеет лексическую, а не глобальную область видимости, и вы можете включать / выключать определенные предупреждения. И не забудьте также начать с «использовать строгий»; : -)

5 голосов
/ 22 октября 2008

Еще одно различие, которое стоит отметить, заключается в том, что прагма «использовать предупреждения» также позволяет выбирать конкретные предупреждения для включения (и аналогично «нет предупреждений» позволяет выбирать предупреждения для отключения).

1 голос
/ 23 октября 2008

Помимо включения / выключения определенных утверждений с помощью прагмы, вы также можете выдавать некоторые или все предупреждения об ошибках:

use strict;
use warnings FATAL => 'all', NONFATAL => 'exec';
0 голосов
/ 21 октября 2008

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

...