Wie erhalten Sie Perl, um zu stoppen und eine Stack-Trace zu geben, wenn Sie einen undef-Wert referenzieren, statt nur zu warnen? Es scheint, dass use strict;
für diesen Zweck nicht ausreicht.Wie kann Perl dazu gebracht werden, beim Referenzieren eines Undef-Wertes zu stoppen?
Antwort
use warnings FATAL => 'uninitialized';
use Carp();
$SIG{__DIE__} = \&Carp::confess;
Die erste Zeile macht die Warnung tödlich. Die nächsten zwei verursachen einen Stack-Trace, wenn Ihr Programm stirbt.
Fügen Sie diese:
use Carp();
Dann sind ein dieser Zeilen am Anfang der Quelldatei:
local $SIG{__WARN__} = \&Carp::confess;
local $SIG{__WARN__} = \&Carp::cluck;
Die confess
Linie wird ein Stack-Trace geben, und die cluck
Linie ist viel knapper.
Das Verweisen auf einen Undef-Wert ist an sich kein Problem, kann jedoch zu Warnungen führen, wenn der Code eine andere als undef erwartet. (besonders wenn Sie versuchen, diese Variable als Objektreferenz zu verwenden). Sie könnten etwas in Ihrem Code setzen wie:
use Carp qw();
[....]
Carp::confess '$variableName is undef' unless defined $variableName;
[....]
Eine Möglichkeit, diese Warnungen fatal zu machen, ist ein Signal-Handler für die virtual-Signal WARN zu installieren:
$SIG{__WARN__} = sub { die "Undef value: @_" if $_[0] =~ /undefined/ };
Statt dem chaotisch fummeln mit %SIG
von allen anderen vorgeschlagen, nur use Carp::Always
und getan werden.
Beachten Sie, dass Sie Module ohne Quellenänderungen in ein Skript einfügen können, indem Sie einfach perl -MCarp::Always
; Außerdem können Sie die Umgebungsvariable PERL5OPT
auf -MCarp::Always
setzen, damit sie geladen wird, ohne den Aufruf des Skripts zu ändern. (Siehe perldoc perlrun
.)
Sie müssen dies manuell tun. Die obigen "Antworten" funktionieren nicht! Testen Sie das einfach:
use strict;
use warnings FATAL => 'uninitialized';
use Carp();
$SIG{__DIE__} = \&Carp::confess;
my $x = undef; # it would be enough to say my $x;
if (!$x->{test}) {
print "no warnings, no errors\n";
}
Sie werden sehen, dass Dereferenzierung keine Fehlermeldungen oder Warnungen verursacht. Ich kenne keine Möglichkeit, Perl zu veranlassen, die Verwendung von undef als eine ungültige Referenz automatisch zu erkennen. Ich vermute, das ist so von Design, so dass Autovivification nahtlos funktioniert.
ein leerer Hash erzeugt 0. Dies scheint ein Sonderfall zu sein. – marinara
- 1. Wie kann R dazu gebracht werden, NAs beim Indizieren in einen Datenrahmen zu "ignorieren"?
- 2. Wie wird der Cursor dazu gebracht, dem Text beim Lesen einer Webseite zu folgen?
- 3. Wie wird der PrintWriter dazu gebracht, UTF-8 zu schreiben?
- 4. Wie kann GCC dazu gebracht werden, mehr als zwei SIMD-Register zu verwenden, wenn intrinsische Daten verwendet werden?
- 5. Perl: Wie kann ich Emacs dazu bringen, dem vollständigen Pfad eines Perl-Skripts Anführungszeichen hinzuzufügen?
- 6. Fehler beim Importieren - Referenzieren eines anderen .java
- 7. Warum werden meine HTML-Dateien beim Hochladen durcheinander gebracht?
- 8. GDB wird dazu gebracht, die Gesamtheit der mehrzeiligen Anweisungen anzuzeigen
- 9. Wie kann ich autlogic dazu bringen, die Rails-Sitzung anstelle eines eigenen Cookies zu verwenden?
- 10. Grails - Ausnahme beim Stoppen/Abbrechen eines Uploads
- 11. Wie wird der Visual Studio-Designer dazu gebracht, CSS in einem ASP.NET-Webbenutzer-Steuerelement korrekt darzustellen?
- 12. Formular beim Ziehen nicht nach vorne gebracht
- 13. Was kann dazu führen, NSUserDefaults gelöscht werden
- 14. Hat jemand IE8 dazu gebracht, DHTML-Verhaltensweisen zu lesen, die als base64-Daten-URIs codiert sind?
- 15. MVC: Autocomplete kann nicht zur Arbeit gebracht werden
- 16. Hat jemand den Node.js-Debugger dazu gebracht, Typoskript-Quellkarten mit einer Quellcodeverzeichnisstruktur zu verwenden?
- 17. Fehler, die Amazon SNS/Cognito dazu gebracht haben, DeviceTokens unter iOS zu registrieren - Objective-C
- 18. Wie Visual Studio dazu gebracht wird, JavaScript-Module mithilfe von Alias anstelle des relativen Pfads zu importieren?
- 19. Wie kann ich einen Teil eines anderen Ordners referenzieren?
- 20. Wie kann verhindert werden, dass HttpListener ausstehende Anforderungen beim Stoppen abbricht? HttpListener.Stop funktioniert nicht
- 21. Wie vermeide ich .Parent.Parent.Parent. etc. beim Referenzieren von Steuerungshierarchien?
- 22. Wie kann beim Erstellen eines Andockcontainers am besten iteriert werden?
- 23. Wie kann ich das Entladen eines Perl-Moduls erzwingen?
- 24. Beim Training zu stoppen - LOOV MLP
- 25. Wie ein UIButton dazu gebracht wird, dass ein UITextField mit der Textbearbeitung beginnt
- 26. Wie geparste Dateien in ein eindeutiges Format gebracht werden
- 27. Wie kann ich TProgressBar stoppen zu verzögern?
- 28. Wie Stoff zu stoppen
- 29. Wie kann Flashvars beim Importieren eines Flash-Films angegeben werden?
- 30. Wie können die Checkboxen in eine runde Form gebracht werden?
Als Alternative zu den letzten beiden Zeilen 'carp :: Always' verwenden. –