strawberry logo lane historia example compilador perl

logo - perl vs python



¿Cómo puedo obtener el nombre de la subrutina actual en Perl? (3)

Existe especial __SUB__ existe desde perl-5.16 .

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

En realidad, puede pasar a sub_fullname cualquier referencia de subrutina (incluso anónima):

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

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__ .

Me gustaría 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 test función.


Use la función de caller :

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

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


caller es la forma correcta de hacerlo en @eugene, señaló si desea hacer esto dentro de la subrutina.

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

Por cierto, mirando

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

Hay algunos puntos importantes que mencionar: Primero, no use prototypes menos que esté tratando de imitar los builtins. En segundo lugar, no use & al invocar una subrutina a menos que necesite específicamente los efectos que proporciona.

Por lo tanto, ese fragmento está mejor escrito como:

sub test { print __LINE__; } test();