Мабуть, use strict
слід (повинні) використовуватись, коли ви хочете змусити perl правильно кодувати, що може бути примусовим декларуванням, будучи явним для рядків і підпунктів, тобто баревок, або використовуючи рефлекси з обережністю. Примітка: якщо є помилки, використання строгих буде перервати виконання, якщо воно використовується.
Хоча use warnings;
ви допоможете знайти помилки введення в програмі, як ви пропустили крапку з комою, ви використовували "elseif", а не "elsif", ви використовуєте застарілий синтаксис або функцію, як би там не було. Примітка: використання попереджень забезпечить лише попередження та продовження виконання, тобто не буде припиняти виконання.
У будь-якому разі, було б краще, якщо ми розберемося в деталях, які я конкретизую нижче
Від perl.com (моя улюблена):
використовувати суворі 'vars';
що означає, що ви завжди повинні оголошувати змінні, перш ніж їх використовувати.
Якщо ви не заявите, ви, ймовірно, отримаєте повідомлення про помилку для незадекларованої змінної
Глобальний символ "$ змінної імені" вимагає явного імені пакета на скрипті scriptname.pl 3
Це застереження означає, що Perl не зовсім зрозумілий, що таке область змінної. Тому вам потрібно чітко вказати свої змінні, що означає або оголосити їх, my
щоб вони були обмежені до поточного блоку, або посилалися на них з їх повною мірою ім'я (наприклад, $ MAIN :: ім'я змінної).
Отже, помилка часу компіляції спрацьовує, якщо ви намагаєтеся отримати доступ до змінної, яка не відповідала принаймні одному з наступних критеріїв:
Заздалегідь визначений самим Perl, таким як @ARGV,% ENV та всі глобальні пунктуаційні змінні, такі як $. або $ _.
Оголошено нашим (для глобального) або моїм (для лексичного).
Імпортовано з іншого пакета. (Прагма використання 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, які можуть бути підводними і можуть бути рядками залежно від контексту, до речі, є головною мовою . Поводження Perle з бареворками може бути заплутаним, і це може призвести до помилок у програмі.
Про помилку - це те, з чим ми стикалися в нашій першій програмі. Пам'ятайте, що 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' );
Бареври в хеш-клавішах завжди інтерпретуються як рядки, тому неоднозначності немає.
використовувати суворі '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) застарілий,
визначений (% хеш), застарілий
Використання мого () у хибних умовних
$ # більше не підтримується
(S) Суворе попередження (увімкнено за замовчуванням)
elseif має бути elsif
% s, коли очікується, що оператор
(Відсутній оператор до% s?)
(Відсутній крапку з комою в попередньому рядку?)
% s ніколи не введено
Оператор або крапка з комою відсутні перед% s
Проблема прецеденту: open% s повинен бути відкритим (% s)
Невідповідність прототипу:% s проти% s
Попередження: Використання "% s" без дужок неоднозначно
Неможливо відкрити% s:% s
use loose;