2010-06-22 3 views
3

Можно создать дубликат:
In Perl, how can a subroutine get a coderef that points to itself?Как получить ссылку на функцию из функции?

Есть ли способ, чтобы получить ссылку на функцию внутри этой функции без используя имя?

Я недавно обнаружил, что неоднократно пишу код, который пахнет анти-шаблоном. Data::Dump поддерживает фильтры, но (с версии 1.16) они не применяются рекурсивно. Чтобы обойти, что я пишу такие вещи, как это:

sub filter { 
    my ($context, $node) = @_; 
    # ... 
    return { dump => dumpf($something, \&filter) }; 
} 

Это работает, но \&filter ссылка начинают ошибка меня. Это создает расходы на обслуживание, если функция переименована или скопирована в другом месте в качестве шаблона для нового фильтра. Я бы хотел заменить его чем-то вроде __SUB__ (если у Perl было такое).

+3

Дубликат: http://stackoverflow.com/questions/2554214/in-perl-how-can-a-subroutine-get-a-coderef-that-points-to-itself ?? – runrig

+1

@runrig: Отлично. Я мог бы поклясться, что здесь есть аналогичный вопрос, но он не мог его найти. –

ответ

3

Для названных подпрограмм можно использовать caller, чтобы получить имя, а затем взять ссылку на него:

sub foo { 
    state $self = \&{(caller(0))[3]}; 
    #... 
    # call $self->(); 
} 

Это не работает для анонимных подпрограмм, которые получают «имена», как main::__ANON__.

Смежные вопросы