2009-02-02 11 views
10

Dada una referencia de subrutina, ¿hay alguna forma de averiguar el archivo y el número de línea donde se declaró la subrutina? advierte y tus amigos parecen acertar, pero necesito esto externamente. Aquí está mi programa de pruebas:¿Cómo puedo obtener el número de archivo y línea donde se creó una referencia de subrutina Perl?

#!/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"; 
} 

que da salida:

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

La información de línea no es lo que estoy esperando, así que supongo que estoy haciendo algo mal (B :: GV tiene un correspondiente Método FILE, pero hasta que funcione LINE, no me sirve de mucho).

¿Hay alguna otra forma de obtener esta información y estoy haciendo algo mal en el código anterior?

Actualización: Al parecer, los métodos 'FILE' y 'LINE' parecen funcionar bien si no estoy usando line directivas. Parece que puede ser un error en el módulo B :: GV.

+0

Quizás una explicación más detallada de lo que está esperando y por qué podría ayudar. Es fácil para el lector casual pasar por alto los comentarios "especiales" en el ejemplo sin entender su efecto en el contador de líneas. – converter42

Respuesta

4

Puede intentar mirar caller. Esto es lo que el depurador usa para construir rastros de pila, por lo que tal vez es lo que quiere.

No creo __LINE__, __FILE__ y __PACKAGE__ ayuda que aquí, ya que sólo proporcionan la ubicación actual de la punto de ejecución, lo que significa que le da un código de referencia o sub como en su código obtendrá los mismos resultados .

Cuestiones relacionadas