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 : Excellent. 나는 여기에 비슷한 질문이 있지만 그것을 찾을 수 없다는 것을 맹세 할 수 있었다. –

답변

3

라는 이름의 서브 루틴을 위해 당신의 이름을 얻을 caller을 사용할 수 있으며 다음에 대한 참조를 가지고 :

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

이 "이름"main::__ANON__ 등을 얻을 익명 서브 루틴, 작동하지 않습니다.

관련 문제