Зачем использовать строгие и предупреждения? - PullRequest
99 голосов
/ 06 ноября 2011

Мне кажется, что многие вопросы в теге Perl можно было бы решить, если бы люди использовали:

use strict;
use warnings;

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

Кажется, что большинство людей, владеющих Perl, всегда используют эти две прагмы, тогда как те, кто больше всего выиграл бы от их использования, редко делают это.Итак, я подумал, что было бы неплохо задать вопрос, на который можно было бы ссылаться при поощрении людей к use strict и warnings.

Итак, зачем Perl-разработчику use strict и warnings?

Ответы [ 8 ]

78 голосов
/ 06 ноября 2011

Для начала, use strict; (и в меньшей степени use warnings;) помогает найти опечатки в именах переменных.Даже опытные программисты делают такие ошибки.Распространенный случай - забыть переименовать экземпляр переменной при очистке или рефакторинге кода.

Использование use strict; use warnings; отлавливает много ошибок раньше, чем они были бы обнаружены в противном случае, что облегчает поиск основных причиношибки.Основной причиной может быть необходимость проверки на наличие ошибок или проверки правильности, и это может произойти независимо от навыков программиста.

Что хорошо в предупреждениях Perl, так это то, что они редко являются поддельными, поэтому их использование практически бесплатно..


Похожие материалы: Зачем использовать my?

27 голосов
/ 12 февраля 2013

Очевидно, use strict следует (нужно) использовать, если вы хотите принудительно заставить perl-код правильно кодировать, что может быть явным образом для объявления, для строк, а также для подпрограмм, то есть голых слов, или с осторожностью использовать ссылки. Примечание: если есть ошибки, использование strict прервет выполнение, если оно будет использовано.

Хотя use warnings; поможет вам найти ошибки в программе, как если бы вы пропустили точку с запятой, вы использовали 'elseif'а не 'elsif', вы используете устаревший синтаксис или функцию, как угодно. Примечание: использование предупреждений только выдаст предупреждения и продолжит выполнение, т.е. не прервет выполнение.

В любом случае, было бы лучше, если мы углубимся в детали, которые я указываю ниже

С perl.com (мой любимый):

использовать строгие 'vars';

, что означает, что вы всегда должны объявлять переменныепрежде чем использовать их.

Если вы не объявите, вы, вероятно, получите сообщение об ошибке для необъявленной переменной

Глобальному символу "$ variablename" требуется явное имя пакета в строке scriptname.pl 3

Это предупреждение означает, что Perl не совсем ясно, какова область действия переменной.Таким образом, вы должны четко указывать свои переменные, что означает либо их объявление с my, чтобы они были ограничены текущим блоком, либо обращение к ним с их полным именем (например, $ MAIN :: variablename).

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

  • Предопределено самим Perl,такие как @ARGV,% ENV и все глобальные переменные пунктуации, такие как $.или $ _.

  • Объявлено с помощью нашего (для глобального) или моего (для лексического).

  • Импортировано из другого пакета.(Использование vars pragma подделывает импорт, но вместо него используется наш.)

  • Полностью определено с использованием имени пакета и разделителя пакетов с двоеточием.

использовать строгие 'subs';

Рассмотрим две программы

# prog 1
   $a = test_value;
   print "First program: ", $a, "\n";
   sub test_value { return "test passed"; }
 Output: First program's result: test_value

# prog 2
   sub test_value { return "test passed"; }
   $a = test_value;
   print "Second program: ", $a, "\n";
 Output: Second program's result: test passed

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

В первой программе, в момент, когда мы достигаем $a = test_value;, Perl не знает ни о каком sub sub test_value (), иtest_value интерпретируется как строка 'test_value'.Во второй программе определение test_value () стоит перед строкой $a = test_value;.Perl считает test_value дополнительным вызовом.

Технический термин для изолированных слов, таких как test_value, которые могут быть подпрограммами и могут быть строками, в зависимости от контекста, кстати, bareword .Обработка в Perl barewords может сбить с толку, и это может вызвать ошибку в программе.

Ошибка - это то, с чем мы столкнулись в нашей первой программе. Помните, что Perl не будет с нетерпением ждать поиска test_value(), так как он еще не видел test_value (), он предполагает, что вам нужна строка.Таким образом, если вы use strict subs;, это приведет к смерти этой программы с ошибкой:

Bareword "test_value" не допускается, когда используются "строгие сабы" на ./a6-strictsubs.pl строка 3.

Решение этой ошибки будет
1. Используйте скобки, чтобы было ясно, что вы вызываете подпрограмму.Если Perl видит $ a = test_value ();,
2. Объявите вашу подпрограмму перед первым использованием

use strict;
sub test_value;  # Declares that there's a test_value() coming later ...
my $a = test_value;  # ...so Perl will know this line is okay.
.......
sub test_value { return "test_passed"; }

3.И если вы хотите использовать его как строку, заключите его в кавычки.

Итак, эта строгость заставляет Perl рассматривать все голые слова как синтаксические ошибки.* A bareword - это любое голое имя или идентификатор, который не имеет другой интерпретации, вызванной контекстом.(Контекст часто форсируется близлежащим ключевым словом или токеном или предварительным объявлением рассматриваемого слова.) * Так что, если вы хотите использовать его в качестве строки, заключите его в кавычки и, если вы хотите использовать его в качестве вызова функции, предварительно объявите егоили используйте скобки.

Голые слова опасны из-за этого непредсказуемого поведения. use strict; (or use strict 'subs';) делает их предсказуемыми, потому что голые слова, которые могут вызвать странное поведение в будущем, приведут к гибели вашей программы до того, как они нанесут ущерб

Есть одно место, где можно использовать голые слова, даже если вы включили строгие сабвуферы: когда вы назначаете хэш-ключи.

$hash{sample} = 6;   # Same as $hash{'sample'} = 6
%other_hash = ( pie => 'apple' );

Голые слова в хеш-ключах всегда интерпретируются как строки, поэтому двусмысленности нет.

используйте строгие 'refs';

Это генерирует ошибку во время выполнения, если вы используете символические ссылки, намеренно или иным образом. Значение, которое не является жесткой ссылкой, затем обрабатывается как символьная ссылка . То есть ссылка интерпретируется как строка, представляющая имя глобальной переменной.

use strict 'refs';

$ref = \$foo;       # Store "real" (hard) reference.
print $$ref;        # Dereferencing is ok.

$ref = "foo";       # Store name of global (package) variable.
print $$ref;        # WRONG, run-time error under strict refs.

используйте предупреждения;

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

С perldiag:

Таким образом, большинство предупреждающих сообщений из приведенных ниже классификаций, т. Е. W, D & S, можно контролировать с помощью прагмы warnings.

(W) Предупреждение (необязательно)
(D) Устаревание (включено по умолчанию)
(S) Серьезное предупреждение (по умолчанию включено)

Я перечислил некоторые из предупреждений, которые часто встречаются ниже по классификациям. Для получения подробной информации о них и других сообщениях см. perldiag

(W) Предупреждение (необязательно):

Отсутствует аргумент в% s
Отсутствует аргумент для -% c
(Вы имели в виду &% s вместо этого?)
(Вы имели в виду «местный» вместо «наш»?)
(Вы имели в виду $ или @ вместо%?)
«% s» не является ссылкой на код
длина () используется на% s
Неверно _ в номере

(D) Амортизация (по умолчанию включено):

определено (@array) устарело
определенный (% хэш) устарел
Устаревшее использование my () в условных ложных выражениях
$ # больше не поддерживается

(S) Серьезное предупреждение (по умолчанию включено)

иначе должно быть elsif
% s найдено там, где ожидал оператор
(Отсутствует оператор до% s?)
(Отсутствует точка с запятой в предыдущей строке?)
% s никогда не вводил
Оператор или точка с запятой отсутствуют до% s
Проблема приоритета: должно быть открыто% s (% s)
Несоответствие прототипа:% s против% s
Предупреждение: использование «% s» без круглых скобок неоднозначно
Не удается открыть% s:% s

10 голосов
/ 06 ноября 2011

Эти две прагмы могут автоматически определять ошибки в вашем коде.

Я всегда использую это в своем коде:

use strict;
use warnings FATAL => 'all';

FATAL делает код умирающим при предупреждениях, как strict делает.

Для получения дополнительной информации см .: Строго используйте предупреждения об использовании FATAL => 'all';

Также ... Стриктуры,по Сьюзу

9 голосов
/ 06 ноября 2011

Есть хорошая тема на perlmonks по этому вопросу.

Основная причина, очевидно, заключается в том, что строгие предупреждения и предупреждения в значительной степени помогают вам обнаруживать ошибки и помогают при отладке.

3 голосов
/ 01 июля 2013

Источник :: Разные блоги

Использование будет экспортировать функции и имена переменных в основное пространство имен функция import () вызывающих модулей.

Прагма - это модуль, который влияет на некоторые аспекты времени компиляции. или поведение perl во время выполнения. Прагмы дают подсказки компилятору.

Использовать предупреждения - Perl жалуется на переменные, использованные только один раз, неправильное преобразование строк в числа. Файлы, которые не открываются. Это происходит во время компиляции. Он используется для контрольные предупреждения.

Использовать строгие - объявлять переменные области видимости. Используется для установки какого-то дисциплина в сценарии. Если в коде используются голые слова, Все переменные должны иметь область видимости, например, my, our или местный.

1 голос
/ 29 июня 2015

Директива use strict предписывает Perl выполнять дополнительную проверку во время компиляции вашего кода. Использование этой директивы сэкономит ваше время на отладку кода Perl, поскольку он обнаруживает распространенные ошибки кодирования, которые вы могли бы пропустить в противном случае.

0 голосов
/ 28 июня 2016
use strict;
use warnings;

Строгий режим и предупреждения - режим для программы Perl. Это позволяет пользователю вводить код более свободно и более того, этот Perl-код будет выглядеть формально, а его стандарт кодирования будет эффективным.

warnings означает то же самое, что и -w в строке perl shebang, поэтому оно будет предоставить вам предупреждения, сгенерированные программой Perl, они будут отображаться в терминале

0 голосов
/ 06 апреля 2015

Строгость и предупреждения гарантируют, что ваши переменные не являются глобальными.

Намного удобнее иметь переменные, уникальные для отдельных методов, чем отслеживать каждое имя переменной.

$ _ или отсутствие переменной для определенных функций также может быть полезно для более быстрого написания более компактного кода.

Однако, если вы не используете строгие и предупреждения, $ _ становится глобальным!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...