Мне кажется, что многие вопросы в теге Perl можно было бы решить, если бы люди использовали:
use strict;
use warnings;
Я думаю, что некоторые люди считают это сродни тренировочным колесам или ненужным усложнениям, что явно неверно, поскольку их используют даже очень опытные программисты Perl.
Кажется, что большинство людей, разбирающихся в Perl, всегда используют эти две прагмы, тогда как те, кто извлек бы наибольшую пользу от их использования, редко. Итак, я подумал, что было бы неплохо иметь вопрос, на который можно было бы ссылаться при поощрении людей к use strict
и warnings
.
Итак, зачем разработчику Perl use strict
и warnings
?
use loose;
use strict
было хорошей идеей, но обратная совместимость уже стала для вас настоящей проблемой :-(use strict;
по умолчанию, когда вы запрашиваете язык Perl 5.12 (или выше). Попробуйperl -e"use v5.012; $x=123;"
.no strict;
фактически выключает его.Ответы:
Для начала
use strict;
(и в меньшей степениuse warnings;
) помогает находить опечатки в именах переменных. Подобные ошибки допускают даже опытные программисты. Распространенный случай - забывают переименовать экземпляр переменной при очистке или рефакторинге кода.Использование
use strict; use warnings;
перехватывает многие ошибки раньше, чем они могут быть обнаружены в противном случае, что упрощает поиск основных причин ошибок. Основной причиной может быть необходимость в проверке ошибок или валидации, и это может произойти независимо от навыков программиста.Что хорошо в предупреждениях Perl, так это тем, что они редко бывают ложными, поэтому их использование практически бесплатно.
Связанное чтение: Зачем использовать
my
?источник
use strict;
включен по умолчанию, если вы используете версию языка 5.12 или новее (use 5.012;
).По-видимому,
use strict
должен (должен) использоваться, когда вы хотите заставить perl правильно кодировать, что может быть принудительным объявлением, явным для строк и подпрограмм, то есть голыми словами или с осторожностью использовать ссылки. Примечание: если есть ошибки, use strict прервет выполнение, если используется.Хотя
use warnings;
это поможет вам найти ошибки ввода в программе, например, вы пропустили точку с запятой, вы использовали elseif, а не elsif, вы используете устаревший синтаксис или функцию, что угодно в этом роде. Примечание: использование предупреждений предоставит только предупреждения и продолжит выполнение, т.е. не прервет выполнение.В любом случае, будет лучше, если мы углубимся в детали, которые я уточняю ниже.
С perl.com (мой любимый):
используйте строгие "вары";
Это означает, что вы всегда должны объявлять переменные перед их использованием.
Если вы не объявите, вы, вероятно, получите сообщение об ошибке для необъявленной переменной.
Это предупреждение означает, что Perl не совсем понимает, какова область видимости переменной. Таким образом, вам нужно четко указывать свои переменные, что означает либо объявление их,
my
чтобы они были ограничены текущим блоком, либо обращение к ним с их полным именем (например, $ MAIN :: variablename).Таким образом, ошибка времени компиляции запускается, если вы пытаетесь получить доступ к переменной, которая не удовлетворяет хотя бы одному из следующих критериев:
Предопределено самим Perl, например @ARGV,% ENV и всеми глобальными переменными пунктуации, такими как $. или $ _.
Объявляется с помощью our (для глобального) или my (для лексического).
Импортировано из другого пакета. (Использование прагмы vars подделывает импорт, но вместо этого используйте наш.)
Полностью определен с использованием имени пакета и разделителя пакетов с двойным двоеточием.
используйте строгие «подписки»;
Рассмотрим две программы
В обоих случаях у нас есть подпрограмма test_value (), и мы хотим поместить ее результат в $ a. И все же, когда мы запускаем две программы, мы получаем два разных результата:
В первой программе, когда мы
$a = test_value;
подошли к этому моменту , Perl не знает ни одной подпрограммы test_value (), а test_value интерпретируется как строка test_value. Во второй программе определение test_value () идет перед$a = test_value;
строкой. Perl считает test_value подвызовом.Кстати, технический термин для отдельных слов, таких как test_value, которые могут быть подпрограммами или строками, в зависимости от контекста, - это голое слово . Обработка простых слов в Perl может сбивать с толку и вызывать ошибку в программе.
Ошибка - это то, с чем мы столкнулись в нашей первой программе. Помните, что Perl не будет ждать ее обнаружения
test_value()
, поэтому, поскольку он еще не видел test_value (), он предполагает, что вам нужна строка. Итак, если выuse strict subs;
, это приведет к тому, что эта программа умрет с ошибкой:Решение этой ошибки:
1. Используйте круглые скобки, чтобы было ясно, что вы вызываете подпрограмму. Если Perl видит $ a = test_value () ;,
2. Объявите свой подпрограмм перед первым использованием
3. И если вы хотите использовать его как строку, укажите его в кавычках.
Итак, эта строгость заставляет Perl рассматривать все голые слова как синтаксические ошибки. * Голое слово - это любое голое имя или идентификатор, не имеющий другой интерпретации, обусловленной контекстом. (Контекст часто вызывается ближайшим ключевым словом или токеном, или предварительным объявлением рассматриваемого слова.) * Итак, если вы хотите использовать его как строку, заключите его в кавычки, а если вы хотите использовать его как вызов функции, объявите его заранее или используйте круглые скобки.
Голые слова опасны из-за такого непредсказуемого поведения.
use strict; (or use strict 'subs';)
делает их предсказуемыми, потому что голые слова, которые могут вызвать странное поведение в будущем, заставят вашу программу умереть, прежде чем они смогут нанести ущербЕсть одно место, где можно использовать голые слова, даже когда вы включили строгие подпрограммы: когда вы назначаете хеш-ключи.
Голые слова в хеш-ключах всегда интерпретируются как строки, поэтому нет двусмысленности.
используйте строгие ссылки;
Это генерирует ошибку времени выполнения, если вы намеренно или иным образом используете символические ссылки. Значение, которое не является жесткой ссылкой, затем рассматривается как символическая ссылка . То есть ссылка интерпретируется как строка, представляющая имя глобальной переменной.
использовать предупреждения;
Эта прагма с лексической областью видимости обеспечивает гибкий контроль над встроенными в Perl предупреждениями, как теми, которые генерируются компилятором, так и системой времени выполнения.
Откуда
perldiag
:Таким образом, большинство предупреждающих сообщений из приведенных ниже классификаций, то есть W, D и S, можно контролировать с помощью
warnings
прагмы.источник
Эти две прагмы могут автоматически определять ошибки в вашем коде.
Я всегда использую это в своем коде:
FATAL
заставляет код умирать при предупреждениях, как иstrict
делает.Для получения дополнительной информации см. Строже с предупреждениями об использовании FATAL => 'all';
Также ... Стриктуры, по словам Сьюза
источник
FATAL => "all"
выполнения до, назначив,$SIG{__WARN__} = sub { croak "fatalized warning @_" };
иначе вы испортите компилятор, пытаясь сказать вам, что ему нужно.perlbug
.По этому вопросу есть хорошая ветка на perlmonks .
Основная причина, очевидно, в том, что строгие правила и предупреждения в значительной степени помогают выявлять ошибки и облегчают отладку.
источник
Источник :: Разные блоги
источник
Директива use strict указывает Perl выполнять дополнительную проверку во время компиляции вашего кода. Использование этой директивы сэкономит вам время на отладку кода Perl, поскольку она обнаруживает общие ошибки кодирования, которые в противном случае вы могли бы упустить.
источник
Строгое и предупреждения убедитесь, что ваши переменные не глобальные.
Гораздо удобнее иметь переменные, уникальные для отдельных методов, чем отслеживать каждое имя переменной.
$ _ или отсутствие переменных для определенных функций также может быть полезно для более быстрого написания более компактного кода.
Однако, если вы не используете строгие правила и предупреждения, $ _ становится глобальным!
источник
Строгий режим и предупреждения - это режим для программы Perl. Это позволяет пользователю вводить код более свободно и, более того, код Perl будет выглядеть формально, а его стандарт кодирования будет эффективным.
предупреждения означают то же, что и
-w
в строке perl shebang, поэтому он предоставит вам предупреждения, сгенерированные программой perl, он будет отображаться в терминалеисточник