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();