В Perl мы можем получить название текущего пакета и текущего номера строки Используя предварительно определенные переменные как __PACKAGE__
и __LINE__
.
Как это я хочу получить название текущей подпрограммы:
use strict;
use warnings;
print __PACKAGE__;
sub test()
{
print __LINE__;
}
&test();
В вышеупомянутом коде я хочу получить название подпрограммы в функции test
.
caller - это правильный способ сделать @eugene указал, если вы хотите сделать это внутри подпрограммы.
Если вы хотите, чтобы другая часть вашей программы могла идентифицировать пакет и информацию об имени для coderef, используйте Sub::Identify.
Кстати, глядя на
sub test()
{
print __LINE__;
}
&test();
есть несколько важных моментов, о которых следует упомянуть: Во-первых, не используйте прототипы, если только вы не пытаетесь имитировать встроенные модули. Во-вторых, не используйте &
при вызове подпрограммы, если вам не нужны эффекты, которые она предоставляет.
Поэтому этот фрагмент лучше написать так:
sub test
{
print __LINE__;
}
test();
Используйте функцию caller ()
:
my $ sub_name = (caller (0)) [3];
Это даст вам имя текущей подпрограммы, включая ее пакет (например, 'main :: test'
). Замыкания возвращают имена вроде 'main :: __ ANON __'
, а в eval это будет '(eval)'
.