2009-02-02 5 views
10

Gibt es eine Subroutinenreferenz, gibt es eine Möglichkeit, die Datei- und Zeilennummer herauszufinden, wo die Subroutine deklariert wurde? Warnen und Freunde scheint das richtig zu machen, aber ich brauche das extern. Hier ist mein Testprogramm:Wie kann ich die Datei- und Zeilennummer erhalten, wo eine Perl-Subroutinenreferenz erstellt wurde?

#!/usr/bin/perl -l 

use strict; 
use warnings; 
use B; 

# line 99 'bin/some_code.pl' 
{ 
    no strict 'refs'; 
    print B::svref_2object(\*{'Foo::some_sub'})->LINE; 
    print B::svref_2object(\&Foo::some_sub)->GV->LINE; 
} 
Foo::some_sub(); 

package Foo; 
# line 23 'bin/some_file.pl' 
sub some_sub { 
    warn "Got to here"; 
} 

Das gibt:

102 
102 
Got to here at 'bin/some_file.pl' line 24. 

Die Linie Informationen ist nicht das, was ich erwarte, so dass ich nehme an, ich mache etwas falsch (B :: GV hat eine entsprechende FILE-Methode, aber bis ich LINE arbeite, ist es mir nicht viel nützen).

Gibt es eine andere Möglichkeit, diese Informationen zu erhalten, und mache ich etwas falsches im obigen Code?

Update: Wie es sich herausstellt, scheinen die "FILE" und "LINE" -Methoden OK zu funktionieren, wenn ich keine Direktiven verwende. Sieht so aus, als könnte es ein Fehler im B :: GV-Modul sein.

+0

Vielleicht würde eine detailliertere Erklärung dessen, was Sie erwarten und warum, helfen. Für den gelegentlichen Leser ist es einfach, die "speziellen" Kommentare im Beispiel zu beschönigen, ohne deren Auswirkung auf den Zeilenzähler zu verstehen. – converter42

Antwort

4

Sie könnten versuchen, Blick auf caller. Dies ist, was der Debugger verwendet, um Stack-Traces zu erstellen, also ist es vielleicht, was Sie wollen.

Ich glaube nicht, __LINE__, __FILE__ und __PACKAGE__ Hilfe Sie hier, wie sie die Lage des aktuellen Punkt der Ausführung nur zur Verfügung stellen, dass eine Referenz-Code oder Unter wie in Ihrem Code angegeben bedeutet, dass Sie die gleichen Ergebnisse erhalten .

Verwandte Themen