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
Topic revision: r7 - 2009-08-11 - 20:14:15 - TinaMueller
 
Bitte die NutzungsBedingungen beachten.
Bei Vorschlägen, Anfragen oder Problemen mit dem PerlCommunityWiki bitten wir um WebBottomBarExample">Rückmeldung.