Najwyraźniej use strict
powinno (musi) być używane, gdy chcesz zmusić perl do poprawnego kodowania, co może wymuszać deklarację, być jawnym na łańcuchach i subskrybowanych, tj. Gołych słowach lub używać referencji z ostrożnością. Uwaga: jeśli wystąpią błędy, użyj opcji strict, jeśli zostanie użyta, przerwie wykonywanie.
Chociaż use warnings;
pomoże ci znaleźć błędy w pisaniu w programie, takie jak pominięcie średnika, użyłeś „elseif”, a nie „elsif”, używasz przestarzałej składni lub funkcji, cokolwiek takiego. Uwaga: ostrzeżenia o używaniu będą tylko zapewniać ostrzeżenia i kontynuować wykonywanie, tj. Nie przerywają wykonywania.
W każdym razie byłoby lepiej, gdybyśmy zagłębili się w szczegóły, które określam poniżej
Z perl.com (mój ulubiony):
używaj ścisłych „vars”;
co oznacza, że zawsze musisz zadeklarować zmienne przed ich użyciem.
Jeśli nie zadeklarujesz, prawdopodobnie otrzymasz komunikat o błędzie dla niezadeklarowanej zmiennej
Globalny symbol "$ variableblename" wymaga wyraźnej nazwy pakietu w linii 3 scriptname.pl
To ostrzeżenie oznacza, że Perl nie jest dokładnie pewien, jaki jest zakres zmiennej. Musisz więc wyraźnie określać swoje zmienne, co oznacza albo deklarowanie ich za pomocą, my
aby były ograniczone do bieżącego bloku, albo odwoływanie się do nich z ich w pełni kwalifikowaną nazwą (na przykład: $ MAIN :: zmienna nazwa).
Tak więc błąd kompilacji jest wyzwalany, jeśli spróbujesz uzyskać dostęp do zmiennej, która nie spełnia co najmniej jednego z poniższych kryteriów:
Predefiniowane przez samego Perla, takie jak @ARGV,% ENV i wszystkie globalne zmienne interpunkcyjne, takie jak $. lub $ _.
Zadeklarowane z naszym (dla globalnego) lub my (dla leksykalu).
Zaimportowano z innego pakietu. (Polecenie use vars pragma udaje import, ale zamiast tego użyj naszego).
W pełni kwalifikowany przy użyciu nazwy pakietu i separatora pakietu z podwójnym dwukropkiem.
użyj ścisłych „sub”;
Rozważ dwa programy
# 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
W obu przypadkach mamy sub test_value () i chcemy umieścić jego wynik w $ a. A jednak po uruchomieniu tych dwóch programów otrzymujemy dwa różne wyniki:
W pierwszym programie, w punkcie, do którego docieramy $a = test_value;
, Perl nie wie o żadnej funkcji test_value (), a test_value jest interpretowana jako łańcuch „test_value”. W drugim programie definicja test_value () znajduje się przed $a = test_value;
linią. Perl uważa test_value za wywołanie podrzędne.
Nawiasem mówiąc, termin techniczny dla izolowanych słów, takich jak test_value, które mogą być znakami zastępczymi i łańcuchami w zależności od kontekstu, to zwykłe słowo . Obsługa zwykłych słów w Perlu może być myląca i może spowodować błąd w programie.
Błąd jest tym, co napotkaliśmy w naszym pierwszym programie, pamiętaj, że Perl nie będzie czekał na znalezienie test_value()
, więc ponieważ nie widział jeszcze test_value (), zakłada, że chcesz napisać. Więc jeśli tak use strict subs;
, spowoduje to śmierć tego programu z błędem:
Zwykłe słowo „test_value” jest niedozwolone, gdy używane są „ścisłe subskrybcje” w ./a6-strictsubs.pl wiersz 3.
Rozwiązaniem tego błędu byłoby
1. Użyj nawiasów, aby wyraźnie zaznaczyć, że dzwonisz do subskrybenta. Jeśli Perl widzi $ a = test_value () ;,
2. Zadeklaruj sub przed pierwszym użyciem
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. A jeśli masz zamiar użyć tego jako ciągu, zacytuj go.
Tak więc to ograniczenie sprawia, że Perl traktuje wszystkie zwykłe słowa jako błędy składniowe. * Samo słowo to dowolna nazwa lub identyfikator, które nie mają innej interpretacji narzuconej przez kontekst. (Kontekst jest często wymuszany przez pobliskie słowo kluczowe lub token, lub przez deklarację danego słowa.) * Więc jeśli masz zamiar użyć go jako ciągu, zacytuj go, a jeśli chcesz użyć go jako wywołania funkcji, zadeklaruj go wcześniej lub użyj nawiasów.
Samotne słowa są niebezpieczne z powodu tego nieprzewidywalnego zachowania. use strict; (or use strict 'subs';)
sprawia, że są przewidywalne, ponieważ zwykłe słowa, które mogą powodować dziwne zachowanie w przyszłości, spowodują, że Twój program umrze, zanim zdążą siać spustoszenie
Jest jedno miejsce, w którym można używać zwykłych słów, nawet po włączeniu ścisłych subskrybentów: podczas przypisywania kluczy skrótu.
$hash{sample} = 6; # Same as $hash{'sample'} = 6
%other_hash = ( pie => 'apple' );
Zwykłe słowa w kluczach skrótu są zawsze interpretowane jako ciągi, więc nie ma niejednoznaczności.
używaj ścisłych „referencji”;
Powoduje to błąd w czasie wykonywania, jeśli celowo lub w inny sposób używasz odwołań symbolicznych. Wartość, która nie jest stałym odniesieniem, jest następnie traktowana jako odniesienie symboliczne . Oznacza to, że odwołanie jest interpretowane jako ciąg reprezentujący nazwę zmiennej globalnej.
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.
używaj ostrzeżeń;
Ta pragma o zasięgu leksykalnym pozwala na elastyczną kontrolę nad wbudowanymi ostrzeżeniami Perla, zarówno tymi emitowanymi przez kompilator, jak i tymi z systemu czasu wykonywania.
Od perldiag
:
Tak więc większość komunikatów ostrzegawczych z poniższych klasyfikacji, tj. W, D i S, można kontrolować za pomocą warnings
pragmy.
(W) Ostrzeżenie (opcjonalne)
(D) Wycofanie (domyślnie włączone)
(S) Poważne ostrzeżenie (domyślnie włączone)
Wymieniłem kilka komunikatów ostrzegawczych, które często pojawiają się poniżej, według klasyfikacji. Szczegółowe informacje o nich i innych wiadomościach znajdziesz w perldiag
(W) Ostrzeżenie (opcjonalnie):
Brakuje argumentu w% s
Missing argument -% c
(? Czy chodziło &% s zamiast)
(? Czy chodziło Ci o "lokalny" zamiast "nasz")
(Czy chodziło Ci o $ lub @ zamiast%?)
„% S 'nie jest
długością odniesienia kodu () używaną w% s
błędnie umieszczonym _ w numerze
(D) Wycofanie (domyślnie włączone):
zdefiniowana (@array) jest przestarzała
zdefiniowana (% hash) jest przestarzała
odrzuconej przetwarzanie moich () w fałszywym warunkowego
$ # nie jest już obsługiwany
(S) Poważne ostrzeżenie (domyślnie włączone)
elseif powinno być elsif
% s znaleziono tam, gdzie oczekiwano operatora
(Brak operatora przed% s?)
(Brak średnika w poprzednim wierszu?)
% s nigdy nie wprowadzono
Operator lub średnik brak przed% s
Problem z pierwszeństwem: otwórz% s powinno być otwarte (% s)
Niezgodność prototypu:% s vs% s
Ostrzeżenie: użycie „% s” bez nawiasów jest niejednoznaczne
Nie można otworzyć% s:% s
use loose;