2010-04-01 7 views
25

En Perl podemos obtener el nombre del paquete actual y el número de línea actual Usando las variables predefinidas como __PACKAGE__ y __LINE__.¿Cómo puedo obtener el nombre de la subrutina actual en Perl?

como no quiero obtener el nombre de la subrutina actual:

use strict; 
use warnings; 

print __PACKAGE__; 
sub test() 
{ 
    print __LINE__; 
} 
&test(); 

En el código anterior Quiero obtener el nombre de la subrutina dentro de la función test.

+1

¿Qué quieres de salida si el subprograma actual es anónimo? –

+5

'sub test() {}' define una función con un prototipo de "()". Supongo que querías 'subtest {}' –

+0

Además, no pongas un símbolo comercial ('&') antes de las llamadas a la subrutina porque probablemente no hace lo que crees que hace. – mpeters

Respuesta

16

caller es la forma correcta de hacerlo en @eugene pointed out si desea hacer esto dentro de la subrutina.

Si desea que otra parte de su programa pueda identificar el paquete y la información del nombre para un coderef, use Sub::Identify.

Por cierto, mirando a

sub test() 
{ 
    print __LINE__; 
} 
&test(); 

hay algunos puntos importantes a mencionar: En primer lugar, no utilice prototypes menos que esté tratando de imitar órdenes internas. En segundo lugar, no use & cuando invoking a subroutine a menos que necesite específicamente los efectos que proporciona.

Por lo tanto, es mejor que el fragmento escrito como:

sub test 
{ 
    print __LINE__; 
} 
test(); 
49

utilizar la función caller():

my $sub_name = (caller(0))[3];

Esto le dará el nombre de la subrutina actual, incluyendo su envoltorio (por ejemplo 'main::test'). Los cierres devuelven nombres como 'main::__ANON__' y en eval será '(eval)'.

+3

que le da principal :: __ ANON__ para un sub anónimo (o foo :: __ ANON__ si el sub anónimo se define en el paquete 'foo ') – mirod

+7

@mirod: 'local * __ ANON__ =" foo ";' - esto se puede usar para establecer un nombre para subrutinas anónimas. –

+0

¡agradable! (No es que yo haría eso, por supuesto ...) – mirod

0

No existe __SUB__ especial de perl-5.16.

use v5.16; 
use Sub::Identify qw/sub_fullname/; 
sub foo { 
    print sub_fullname(__SUB__); # main::foo 
} 

foo(); 

En realidad se puede pasar a cualquier referencia sub_fullname subrutina (incluso anónimo):

use Sub::Identify qw/sub_fullname/; 
sub foo { 
    print sub_fullname(\&foo); # main::foo 
    print sub_fullname(sub{}); # main::__ANON__ 
} 

foo(); 
+0

Y si alguien quiere dar el nombre a '__ANON__' ver [aquí] (http://www.perlmonks.org/?node_id = 395912) –

Cuestiones relacionadas