Очевидно, 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