Backtracing in Subroutinen
Mit
caller kannst du in einer Methode herausfinden, wer diese von wo aus aufgerufen hat.
Beispiel:
use strict;
use Data::Dumper;
main::t(
-option1 => 'arg1',
-option2 => 'arg2',
);
sub t {
my %p = @_;
my ($package, $filename, $line) = caller;
print Data::Dumper::Dumper( $package, $filename, $line );
}
Ausgabe:
$VAR1 = 'main';
$VAR2 = 'test.pl';
$VAR3 = 15;
--
HerbertBreunung (hats nur verschoben) - 09 Apr 2006
Das müsste auch einfacher mit Perl Tokens gehen.
sub mittoken {
# Mache Irgendwas.
print "Zeile: " . __LINE__ ;
print "Datei: " . __FILE__;
print "Package: " . __PACKAGE__ ;
# Mache Irgendwas.
}
Das geht nicht einfacher mit perl Tokens. Wenn ich herausfinden will, von wo aus etwas afgerufen wird,
kann ich nicht an der aufrufenden Stelle etwas hinschreiben, weil ich die Stelle noch gar nicht weiß.
--
TinaMueller - 24 May 2006
Also caller liefert die Infos, von wo die aktuelle sub aufgerufen wurde.
Die Token liefern die Infos zu der sub. Wenn man z.B. eine Debug-Funktion schreibt, dann soll
die Zeile (und File und Package) der debuggten Stelle angezeigt werden und nicht wo die Debug-Funktion steht.
Zum Ausprobieren habe ich die beiden Beispiele zusammengefasst:
use strict;
use Data::Dumper;
print "zuerst mit caller:\n";
main::t(
-option1 => 'arg1',
-option2 => 'arg2',
);
print "\ndann mit Token:\n";
main::mittoken(
-option1 => 'arg1',
-option2 => 'arg2',
);
sub t {
my %p = @_;
my ($package, $filename, $line) = caller;
print Data::Dumper::Dumper( $package, $filename, $line );
}
sub mittoken {
# Mache Irgendwas.
print "Zeile: " . __LINE__ . "\n";
print "Datei: " . __FILE__. "\n";
print "Package: " . __PACKAGE__ . "\n";
# Mache Irgendwas.
}
--
WielandPusch - 05 Sep 2007