Мне кажется, что многие вопросы в теге Perl могут быть решены, если люди будут использовать:
Я думаю, что некоторые считают, что они сродни тренировочным колесам или ненужным осложнениям, что явно не так, поскольку их используют даже очень опытные программисты на Perl.
Кажется, что большинство людей, владеющих Perl, всегда используют эти две прагмы, тогда как те, кто больше всего выиграет от их использования, редко делают. Итак, я подумал, что было бы неплохо связать вопрос, когда поощряя людей к use strict
и warnings
.
Ответ 2
По-видимому, use strict
должен (должен) использоваться, когда вы хотите принудительно принудительно использовать perl для кода, который мог бы форсировать объявление, будучи явным для строк и подтипов i.e., или использовать ссылки с осторожностью. Примечание: если есть ошибки, использование строкой отменяет выполнение, если используется.
Пока use warnings;
поможет вам найти ошибки ввода в программе, например, вы пропустили точку с запятой, вы использовали "elseif", а не "elsif", вы используете устаревший синтаксис или функцию, как бы то ни было. Примечание: использование предупреждений будет предоставлять предупреждения и продолжать выполнение, т.е. не отменяет выполнение.
В любом случае, было бы лучше, если мы перейдем к деталям, о которых я расскажу ниже
Из perl.com (мой любимый):
используйте строгие 'vars';
что означает, что вы должны всегда объявлять переменные перед их использованием.
Если вы не объявите, вы, вероятно, получите сообщение об ошибке для необъявленной переменной
Глобальный символ "$ varablename" требует явного имени пакета в строке scriptname.pl 3
Это предупреждение означает, что Perl не совсем ясно, что такое переменная. Поэтому вам нужно четко указать свои переменные, что означает либо объявить их с помощью my
, чтобы они были ограничены текущим блоком, либо ссылались на них с их полным именем (для ex: $MAIN:: variablename).
Итак, ошибка времени компиляции запускается, если вы пытаетесь получить доступ к переменной, которая не выполнила хотя бы один из следующих критериев:
-
Предопределено самим Perl, таким как @ARGV,% ENV и всеми глобальными переменными пунктуации, такими как $. или $_.
-
Объявлено с нашим (для глобального) или my (для лексического).
-
Импортировано из другого пакета. (Использование vars pragma подталкивает импорт, но использует наш вместо этого.)
-
Полностью квалифицируется с использованием имени пакета и разделителя пакетов с двойной колонкой.
использовать строгие 'subs';
Рассмотрим две программы
# prog 1
$a = test_value;
print "First program: ", $a, "\n";
sub test_value { return "test passed"; }
Output: First program result: test_value
# prog 2
sub test_value { return "test passed"; }
$a = test_value;
print "Second program: ", $a, "\n";
Output: Second program result: test passed
В обоих случаях у нас есть test_value(), и мы хотим поместить его результат в $a. И все же, когда мы запускаем две программы, мы получаем два разных результата:
В первой программе, в точке, которую мы получаем до $a = test_value;
, Perl не знает ни одного элемента test_value(), а test_value интерпретируется как строка test_value. Во второй программе определение test_value() предшествует строке $a = test_value;
. Perl считает, что test_value является подзаголовком.
Технический термин для изолированных слов, таких как test_value, которые могут быть subs и может быть строками, в зависимости от контекста, между прочим, является bareword. Обработка Perl barewords может сбивать с толку, и это может вызвать ошибку в программе.
Ошибка, с которой мы столкнулись в нашей первой программе. Помните, что Perl не ожидает поиска test_value()
, так как он еще не видел test_value(), он предполагает, что вам нужна строка. Поэтому, если вы use strict subs;
, это заставит эту программу умереть с ошибкой:
Bareword "test_value" не допускается, пока используются "строгие субтитры". /a 6-strictsubs.pl строка 3.
Решение этой ошибки будет
1. Используйте круглые скобки, чтобы было ясно, что вы вызываете sub. Если Perl видит $a = test_value();,
2. Объявите свой юнит перед его первым использованием.
use strict;
sub test_value; # Declares that there 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 рассматривать все слова как синтаксические ошибки. * Говорное слово - любое голое имя или идентификатор, который не имеет другой интерпретации, вызванной контекстом. (Контекст часто заставляют соседнее ключевое слово или токен, или путем предопределения рассматриваемого слова.) * Итак, если вы хотите использовать его как строку, процитируйте его, и если вы хотите использовать его в качестве вызова функции, представьте его или используйте круглые скобки.
Баги опасны из-за этого непредсказуемого поведения. 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' не является ссылкой на код length() используется на% s
Неверное _ число
(D) Уступка (включена по умолчанию):
defined (@array) устарел
определенный (% hash) устарел
Устаревшее использование my() в ложном условном выражении $# больше не поддерживается
(S) Серьезное предупреждение (включено по умолчанию)
elseif должен быть elsif
% s найдено, где оператор ожидал
(Отсутствует оператор до% s?)
(Отсутствует точка с запятой на предыдущей строке?)
% s никогда не вводится
Оператор или точка с запятой отсутствует до% s
Проблема приоритета: открыть% s должен быть открыт (% s)
Несоответствие прототипа:% s vs% s
Предупреждение: использование "% s" без круглых скобок неоднозначно
Не удается открыть% s:% s