Haftungsausschluss: Dies ist nur ein Versuch, das Verhalten zu erklären.
Devel :: Vorfachhaken zum Perl debugging API durch das DB-Modell auf. Das ist nur Code. It installs a subDB::DB
.
Die große Frage ist, wann wird das ausgeführt. Gemäß perlmod gibt es fünf Blocktypen, die während der Ausführung an bestimmten Punkten ausgeführt werden. Einer von ihnen ist BEGIN
, der erste ist.
Betrachten Sie dieses Programm.
use strict;
use warnings;
our ($x, $y);
BEGIN { $x = '42' }
UNITCHECK { 'unitcheck' }
CHECK { 'check' }
INIT { 'init' }
END { 'end' }
print "$x\n";
Dies wird Ausgang der folgende:
>> trace.pl:8: INIT { 'init' }
>> trace.pl:3: our ($x, $y);
>> trace.pl:11: print "$x\n";
42
>> trace.pl:9: END { 'end' }
So Devel :: Trace sieht den INIT
Block und den END
Block. Aber warum blockiert der INIT
?
oben erwähnt perlmod sagt:
INIT Blöcke nur ausgeführt werden, bevor die Perl Laufzeitausführung beginnt, in "first in, first out" (FIFO) Ordnung.
Offenbar in dieser Phase hat die DB::DB
bereits installiert. Ich konnte keine Dokumentation finden, die sagt, wenn eine sub
Definition genau ausgeführt wird. Es scheint jedoch, dass es nach BEGIN
und vor INIT
ist. Daher sieht es nicht, was in der BEGIN
vorgeht.
Das Hinzufügen eines BEGIN { $Devel::Trace::TRACE = 1 }
an den Anfang der Datei hilft auch nicht.
Ich kramte in der Dokumentation für perldebug und dergleichen, konnte aber keine Erklärung für dieses Verhalten finden. Meine Vermutung ist, dass die Debugger-Schnittstelle über BEGIN
überhaupt nicht weiß. Sie werden sehr früh ausgeführt (z. B. perl -c -E 'BEGIN{ say "foo" } say "bar"'
wird gedruckt foo.)
@toolic warum nicht? Es druckt sicherlich einen "END" -Block. Aber zum Zeitpunkt der Ausführung des 'BEGIN' ist es nicht vollständig geladen. – simbabque
Ja. Also, könnte genauer sein. Wie bekomme ich die BEGIN-Blockanweisungen (wie bei der -d: Trace), aber auf andere Weise? (z. B. mit dem DB :: oder so?) – kobame