По-видимому, use strict
должен (должен) использоваться, когда вы хотите заставить perl правильно кодировать, что может быть принудительным объявлением, явным для строк и подпрограмм, то есть голыми словами или с осторожностью использовать ссылки. Примечание: если есть ошибки, use strict прервет выполнение, если используется.
Хотя use warnings;
это поможет вам найти ошибки ввода в программе, например, вы пропустили точку с запятой, вы использовали elseif, а не elsif, вы используете устаревший синтаксис или функцию, что угодно в этом роде. Примечание: использование предупреждений предоставит только предупреждения и продолжит выполнение, т.е. не прервет выполнение.
В любом случае, будет лучше, если мы углубимся в детали, которые я уточняю ниже.
С perl.com (мой любимый):
используйте строгие "вары";
Это означает, что вы всегда должны объявлять переменные перед их использованием.
Если вы не объявите, вы, вероятно, получите сообщение об ошибке для необъявленной переменной.
Глобальный символ "$ variablename" требует явного имени пакета в строке 3 scriptname.pl
Это предупреждение означает, что Perl не совсем понимает, какова область видимости переменной. Таким образом, вам нужно четко указывать свои переменные, что означает либо объявление их, my
чтобы они были ограничены текущим блоком, либо обращение к ним с их полным именем (например, $ MAIN :: variablename).
Таким образом, ошибка времени компиляции запускается, если вы пытаетесь получить доступ к переменной, которая не удовлетворяет хотя бы одному из следующих критериев:
Предопределено самим Perl, например @ARGV,% ENV и всеми глобальными переменными пунктуации, такими как $. или $ _.
Объявляется с помощью our (для глобального) или my (для лексического).
Импортировано из другого пакета. (Использование прагмы vars подделывает импорт, но вместо этого используйте наш.)
Полностью определен с использованием имени пакета и разделителя пакетов с двойным двоеточием.
используйте строгие «подписки»;
Рассмотрим две программы
# 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. И все же, когда мы запускаем две программы, мы получаем два разных результата:
В первой программе, когда мы $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;
, это приведет к тому, что эта программа умрет с ошибкой:
Голое слово "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 рассматривать все голые слова как синтаксические ошибки. * Голое слово - это любое голое имя или идентификатор, не имеющий другой интерпретации, обусловленной контекстом. (Контекст часто вызывается ближайшим ключевым словом или токеном, или предварительным объявлением рассматриваемого слова.) * Итак, если вы хотите использовать его как строку, заключите его в кавычки, а если вы хотите использовать его как вызов функции, объявите его заранее или используйте круглые скобки.
Голые слова опасны из-за такого непредсказуемого поведения. use strict; (or use strict 'subs';)
делает их предсказуемыми, потому что голые слова, которые могут вызвать странное поведение в будущем, заставят вашу программу умереть, прежде чем они смогут нанести ущерб
Есть одно место, где можно использовать голые слова, даже когда вы включили строгие подпрограммы: когда вы назначаете хеш-ключи.
$hash{sample} = 6; # Same as $hash{'sample'} = 6
%other_hash = ( pie => 'apple' );
Голые слова в хеш-ключах всегда интерпретируются как строки, поэтому нет двусмысленности.
используйте строгие ссылки;
Это генерирует ошибку времени выполнения, если вы намеренно или иным образом используете символические ссылки. Значение, которое не является жесткой ссылкой, затем рассматривается как символическая ссылка . То есть ссылка интерпретируется как строка, представляющая имя глобальной переменной.
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 вместо этого?)
(Вы имели в виду "local" вместо "our"?)
(Вы имели в виду $ или @ вместо%?)
'% S 'не является ссылочной
длиной кода (), используемой в% s
Misplaced _ в номере
(D) Устарение (по умолчанию включено):
определено (@array) устарело
определено (% hash) устарело
Использование my () в ложном условном
$ # больше не поддерживается
(S) Серьезное предупреждение (по умолчанию включено)
elseif должен быть elsif
% s должен быть найден там, где ожидался оператор
(Отсутствует оператор перед% s?)
(Отсутствует точка с запятой в предыдущей строке?)
% s никогда не вводился
Оператор или точка с запятой отсутствуют перед% s
Проблема приоритета: открыть% s должен быть открыт (% s)
Несоответствие прототипа:% s vs% s
Предупреждение: использование "% s" без скобок является неоднозначным.
Невозможно открыть% s:% s
use loose;