Как я могу получить название текущей подпрограммы в Perl? - PullRequest
29 голосов
/ 01 апреля 2010

В Perl мы можем получить имя текущего пакета и номер текущей строки, используя предопределенные переменные, такие как __PACKAGE__ и __LINE__.

Вот так я хочу получить имя текущей подпрограммы:

use strict;
use warnings;

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

В приведенном выше коде я хочу получить имя подпрограммы внутри функции test.

Ответы [ 3 ]

54 голосов
/ 01 апреля 2010

Используйте функцию caller():

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

Это даст вам имя текущей подпрограммы, включая ее пакет (например, 'main::test'). Замыкания возвращают имена вроде 'main::__ANON__', а в eval это будет '(eval)'.

18 голосов
/ 01 апреля 2010

Абонент - правильный способ сделать на @ Евгений указал , если вы хотите сделать это внутри подпрограммы.

Если вы хотите, чтобы другая часть вашей программы могла идентифицировать информацию о пакете и имени для coderef, используйте Sub :: Identify .

Кстати, глядя на

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

Есть несколько важных моментов, которые следует упомянуть: во-первых, не используйте прототипы , если вы не пытаетесь имитировать встроенные функции. Во-вторых, не используйте &, когда вызывает подпрограмму , если только вам не нужны эффекты, которые она обеспечивает.

Следовательно, этот фрагмент лучше записать как:

sub test
{
    print __LINE__;
}
test();
2 голосов
/ 18 января 2018

Существует специальное __SUB__ от perl-5.16.

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

foo();

На самом деле вы можете передать sub_fullname любую ссылку на подпрограмму (даже анонимную):

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

foo();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...