Es scheint mir, dass viele der Fragen im Perl-Tag gelöst werden könnten, wenn die Leute Folgendes verwenden würden:
use strict;
use warnings;
Ich denke, einige Leute halten diese für Stützräder oder unnötige Komplikationen, was eindeutig nicht der Fall ist, da sie selbst von sehr erfahrenen Perl-Programmierern verwendet werden.
Es scheint, als ob die meisten Leute, die Perl beherrschen, diese beiden Pragmas immer verwenden, während diejenigen, die am meisten davon profitieren würden, dies selten tun. Daher dachte ich, es wäre eine gute Idee, eine Frage zu haben, auf die man sich beziehen kann, wenn man Menschen dazu ermutigt, use strict
und warnings
.
Also, warum sollte ein Perl-Entwickler use strict
und warnings
?
use loose;
use strict
eine gute Idee war, aber Abwärtskompatibilität ist bereits ein echtes Problem für Sie geworden :-(use strict;
standardmäßig aktiviert, wenn Sie die Sprache Perl 5.12 (oder höher) anfordern. Versuchen Sie esperl -e"use v5.012; $x=123;"
.no strict;
schaltet es tatsächlich aus.Antworten:
Für den Anfang
use strict;
(und in geringerem Maßeuse warnings;
) hilft es, Tippfehler in Variablennamen zu finden. Selbst erfahrene Programmierer machen solche Fehler. Ein häufiger Fall ist das Vergessen, eine Instanz einer Variablen beim Bereinigen oder Umgestalten von Code umzubenennen.Die Verwendung
use strict; use warnings;
fängt viele Fehler früher ab, als sie sonst abgefangen würden, was es einfacher macht, die Grundursachen der Fehler zu finden. Die Hauptursache könnte die Notwendigkeit einer Fehler- oder Validierungsprüfung sein, und dies kann unabhängig von den Fähigkeiten des Programmierers geschehen.Das Gute an Perl-Warnungen ist, dass sie selten falsch sind, sodass ihre Verwendung so gut wie keine Kosten verursacht.
Verwandte Lektüre: Warum verwenden
my
?quelle
use strict;
standardmäßig aktiviert ist, wenn Sie Version 5.12 oder höher der Sprache (use 5.012;
) verwenden.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
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
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 Sieuse strict subs;
dies tun , wird dieses Programm mit einem Fehler sterben: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
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önnenEs 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.
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.
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 .quelle
Diese beiden Pragmas können Fehler in Ihrem Code automatisch identifizieren.
Ich benutze dies immer in meinem Code:
FATAL
Lässt den Code bei Warnungen sterben, genau wie dies derstrict
Fall ist.Weitere Informationen finden Sie unter: Strengere Verwendung von Warnungen FATAL => 'all';
Auch ... Die Strikturen laut Seuss
quelle
FATAL => "all"
Kassenlaufzeit verzögern , indem$SIG{__WARN__} = sub { croak "fatalized warning @_" };
Sie den Compiler zuweisen oder vermasseln, um Ihnen zu sagen, was er braucht.perlbug
.Es gibt einen guten Thread über Perlmonks zu dieser Frage.
Der Hauptgrund ist offensichtlich, dass strenge und Warnungen Ihnen massiv helfen, Fehler zu erkennen und das Debuggen zu unterstützen.
quelle
Quelle :: Verschiedene Blogs
quelle
Die Direktive "use strict" weist Perl an, während der Kompilierung Ihres Codes zusätzliche Überprüfungen durchzuführen. Durch die Verwendung dieser Anweisung sparen Sie Zeit beim Debuggen Ihres Perl-Codes, da häufig auftretende Codierungsfehler gefunden werden, die Sie sonst möglicherweise übersehen.
quelle
Strenge und Warnungen stellen sicher, dass Ihre Variablen nicht global sind.
Es ist viel übersichtlicher, Variablen zu haben, die für einzelne Methoden eindeutig sind, anstatt jeden einzelnen Variablennamen im Auge zu behalten.
$ _ oder keine Variable für bestimmte Funktionen kann auch nützlich sein, um kompakteren Code schneller zu schreiben.
Wenn Sie jedoch keine strengen Warnungen und Warnungen verwenden, wird $ _ global!
quelle
Streng und Warnungen sind der Modus für das Perl-Programm. Es ermöglicht dem Benutzer, den Code großzügiger und darüber hinaus einzugeben. Der Perl-Code sieht formal aus und sein Codierungsstandard ist wirksam.
Warnungen bedeutet dasselbe wie
-w
in der Perl-Shebang-Zeile. Sie erhalten also die vom Perl-Programm generierten Warnungen und werden im Terminal angezeigtquelle