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

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

пример 1:

#!/usr/bin/perl

use warnings;

пример 2:

#!/usr/bin/perl -w
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
15
0
4 336
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Ответ принят как подходящий

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

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

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

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

Ваша точка зрения на «без предупреждений» - это то, что я ожидал, но быстрый тест (perl -w -e «no warnings; print $ a;») показал, что, по крайней мере, на моем perl, «без предупреждений» все еще работает даже с -w.

Dave Sherohman 22.10.2008 02:55

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

Начиная с версии 5.6.0. И есть warnings :: compat, которые помогут, если вам все еще небезразлична версия 5.5.

Schwern 22.10.2008 00:13

Зафиксированный. Я знал, что надо было просто сказать "5.6" :-)

runrig 22.10.2008 02:49

Но зачем кому-то вообще использовать 5.6.0? :-)

runrig 22.10.2008 20:20

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

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

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

Это хорошая идея во время разработки, но может быть не такой уж и хорошей идеей при развертывании.

Leon Timmermans 24.10.2008 04:16

Другие вопросы по теме