2008-10-21 8 views
15

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

Пример 1:

#!/usr/bin/perl 

use warnings; 

Пример 2:

#!/usr/bin/perl -w 

ответ

31

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

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

17

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

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

+2

Ваша точка «без каких-либо предупреждений» является то, что я ожидал, но быстрый тест (perl -w -e «никаких предупреждений; print $ a;») показал, что, по крайней мере, на моем perl, «никаких предупреждений» все еще работает даже с -w. – 2008-10-21 22:55:06

10

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

+0

По состоянию на 5.6.0. И есть предупреждения :: compat помочь, если вам все равно 5,5. – Schwern 2008-10-21 20:13:17

+0

Исправлено. Я знал, что должен просто сказать «5.6» :-) – runrig 2008-10-21 22:49:58

+0

Но зачем кому-то вообще хотеть использовать 5.6.0? :-) – runrig 2008-10-22 16:20:15

5

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

1

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

use strict; 
use warnings FATAL => 'all', NONFATAL => 'exec';