Anscheinend use strict
sollte (muss) verwendet werden, wenn Sie Perl zwingen möchten, richtig zu codieren, was dazu führen kann, dass die Deklaration erzwungen wird, explizit auf Zeichenfolgen und Unterzeichen, dh Barwords, Bezug genommen wird oder Refs mit Vorsicht verwendet werden. Hinweis: Wenn Fehler auftreten, bricht die Verwendung von strict die Ausführung ab, wenn sie verwendet wird.
Während use warnings;
Sie Tippfehler im Programm finden können, als hätten Sie ein Semikolon verpasst, haben Sie 'elseif' und nicht 'elsif' verwendet. Sie verwenden jedoch eine veraltete Syntax oder Funktion, wie auch immer. Hinweis: Verwenden Sie Warnungen, um nur Warnungen bereitzustellen und die Ausführung fortzusetzen, dh die Ausführung wird nicht abgebrochen.
Wie auch immer, es wäre besser, wenn wir auf Details eingehen, die ich unten spezifiziere
Von perl.com (mein Favorit):
benutze strenge 'vars';
Dies bedeutet, dass Sie Variablen immer deklarieren müssen, bevor Sie sie verwenden.
Wenn Sie nicht deklarieren, erhalten Sie wahrscheinlich eine Fehlermeldung für die nicht deklarierte Variable
Das globale Symbol "$ variablename" erfordert einen expliziten Paketnamen in Zeile 3 von scriptname.pl
Diese Warnung bedeutet, dass Perl nicht genau weiß, welchen Umfang die Variable hat. Sie müssen Ihre Variablen also explizit angeben, dh sie mit deklarieren, my
damit sie auf den aktuellen Block beschränkt sind, oder mit ihrem vollständig qualifizierten Namen auf sie verweisen (z. B. $ MAIN :: Variablenname).
Daher wird ein Fehler bei der Kompilierung ausgelöst, wenn Sie versuchen, auf eine Variable zuzugreifen, die mindestens eines der folgenden Kriterien nicht erfüllt:
Vordefiniert von Perl selbst wie @ARGV,% ENV und allen globalen Interpunktionsvariablen wie $. oder $ _.
Erklärt mit unserem (für ein globales) oder meinem (für ein lexikalisches).
Aus einem anderen Paket importiert. (Die Verwendung vars pragma fälscht einen Import, aber verwenden Sie stattdessen unsere.)
Vollständig qualifiziert mit seinem Paketnamen und dem Doppelpunkt-Pakettrennzeichen.
benutze strenge 'subs';
Betrachten Sie zwei Programme
# 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
In beiden Fällen haben wir ein test_value () -Unter und möchten das Ergebnis in $ a setzen. Wenn wir jedoch die beiden Programme ausführen, erhalten wir zwei unterschiedliche Ergebnisse:
Im ersten Programm $a = test_value;
kennt Perl an dem Punkt, an dem wir ankommen, kein test_value () -Unter, und test_value wird als Zeichenfolge 'test_value' interpretiert. Im zweiten Programm steht die Definition von test_value () vor der $a = test_value;
Zeile. Perl denkt test_value als Unteraufruf.
Der Fachbegriff für isolierte Wörter wie test_value, die je nach Kontext Unter- und Zeichenfolgen sein können, ist übrigens Barwort . Perls Umgang mit Barwörtern kann verwirrend sein und Programmfehler verursachen.
Der Fehler ist der, auf den wir in unserem ersten Programm gestoßen sind. Denken Sie daran, dass Perl sich nicht darauf freut, ihn zu finden test_value()
. Da test_value () noch nicht gesehen wurde, wird davon ausgegangen, dass Sie einen String möchten. Wenn Sie use strict subs;
dies tun , wird dieses Programm mit einem Fehler sterben:
Barwort "test_value" nicht zulässig, solange "strenge Subs" in Zeile 3 von ./a6-strictsubs.pl verwendet werden.
Die Lösung für diesen Fehler wäre
1. Verwenden Sie Klammern, um zu verdeutlichen, dass Sie ein Sub aufrufen. Wenn Perl $ a = test_value (); sieht,
2. Deklarieren Sie Ihr Sub, bevor Sie es zum ersten Mal verwenden
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. Und wenn Sie es als Zeichenfolge verwenden möchten, zitieren Sie es.
Aufgrund dieser Einschränkung behandelt Perl alle Barwörter als Syntaxfehler. * Ein Barwort ist ein bloßer Name oder eine Kennung, für die keine andere Interpretation durch den Kontext erzwungen wird. (Der Kontext wird häufig durch ein nahe gelegenes Schlüsselwort oder Token oder durch eine Vordeklaration des betreffenden Wortes erzwungen.) * Wenn Sie es also als Zeichenfolge verwenden möchten, zitieren Sie es und wenn Sie es als Funktionsaufruf verwenden möchten, deklarieren Sie es oder verwenden Sie Klammern.
Barwörter sind wegen dieses unvorhersehbaren Verhaltens gefährlich. use strict; (or use strict 'subs';)
macht sie vorhersehbar, da Barewords, die in Zukunft seltsames Verhalten verursachen könnten, Ihr Programm sterben lassen, bevor sie Chaos anrichten können
Es gibt einen Ort, an dem es in Ordnung ist, Barewords zu verwenden, selbst wenn Sie strenge Subs aktiviert haben: wenn Sie Hash-Schlüssel zuweisen.
$hash{sample} = 6; # Same as $hash{'sample'} = 6
%other_hash = ( pie => 'apple' );
Barwörter in Hash-Schlüsseln werden immer als Zeichenfolgen interpretiert, sodass keine Mehrdeutigkeit besteht.
benutze strenge 'refs';
Dies erzeugt einen Laufzeitfehler, wenn Sie absichtlich oder auf andere Weise symbolische Referenzen verwenden. Ein Wert, der keine feste Referenz ist, wird dann als symbolische Referenz behandelt . Das heißt, die Referenz wird als Zeichenfolge interpretiert, die den Namen einer globalen Variablen darstellt.
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.
Warnungen verwenden;
Dieses Pragma mit lexikalischem Gültigkeitsbereich ermöglicht eine flexible Steuerung der integrierten Warnungen von Perl, sowohl der vom Compiler als auch des Laufzeitsystems.
Von perldiag
:
Die meisten Warnmeldungen aus den folgenden Klassifikationen, dh W, D & S, können mithilfe des warnings
Pragmas gesteuert werden .
(W) Eine Warnung (optional)
(D) Eine Abwertung (standardmäßig aktiviert)
(S) Eine schwerwiegende Warnung (standardmäßig aktiviert)
Ich habe einige Warnmeldungen aufgelistet, die häufig unten durch Klassifizierungen auftreten. Detaillierte Informationen zu ihnen und anderen Nachrichten finden Sie unter perldiag
(W) Eine Warnung (optional):
Fehlendes Argument in% s
Fehlendes Argument für -% c
(Meinten Sie stattdessen &% s?)
(Meinten Sie "lokal" anstelle von "unser"?)
(Meinten Sie $ oder @ anstelle von%?)
'% S. 'ist keine Code-Referenzlänge
(), die für% s
falsch platzierte _ in Nummer verwendet wird
(D) Eine Verwerfung (standardmäßig aktiviert):
defined (@array) ist veraltet
definiert (% hash) ist veraltet Die
veraltete Verwendung von my () in der falschen Bedingung
$ # wird nicht mehr unterstützt
(S) Eine schwerwiegende Warnung (standardmäßig aktiviert)
elseif sollte elsif
% s gefunden werden, wo der Operator erwartet wurde
(Fehlender Operator vor% s?)
(Fehlendes Semikolon in der vorherigen Zeile?)
% s nie eingeführt
Operator oder Semikolon fehlen vor% s
Vorrangproblem: offen% s sollte offen sein (% s)
Nicht übereinstimmende Prototypen:% s vs% s
Warnung: Die Verwendung von "% s" ohne Klammern ist nicht eindeutig.
% S:% s kann nicht geöffnet werden
use loose;