Perl 모듈이 가지고있는 모든 서브 루틴을 발견하는 가장 좋은 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/607282

문제

Perl 모듈이 가지고있는 모든 서브 루틴을 프로그래밍적으로 발견하는 가장 좋은 방법은 무엇입니까? 이것은 모듈, 클래스 (@export 없음) 또는 그 사이의 것일 수 있습니다.

편집 : 아래의 모든 방법은 작동하는 것처럼 보입니다. 나는 아마도 클래스 :: sniff 또는 class :: Inspector를 생산에 사용합니다. 그러나 레온의 대답은 제기 된 질문에 대답하기 때문에 '수용'으로 표시됩니다. no strict 'refs' 사용해야합니다. :-) 클래스 :: 스니프가 진행됨에 따라 좋은 선택 일 수 있습니다. 많은 생각이 들어간 것 같습니다.

도움이 되었습니까?

해결책

sub list_module {
    my $module = shift;
    no strict 'refs';
    return grep { defined &{"$module\::$_"} } keys %{"$module\::"}
}

ETA : 수입 된 서브 루틴을 걸러 내고 싶다면이 작업을 수행 할 수 있습니다.

use B qw/svref_2object/;

sub in_package {
    my ($coderef, $package) = @_;
    my $cv = svref_2object($coderef);
    return if not $cv->isa('B::CV') or $cv->GV->isa('B::SPECIAL');
    return $cv->GV->STASH->NAME eq $package;
}

sub list_module {
    my $module = shift;
    no strict 'refs';
    return grep { defined &{"$module\::$_"} and in_package(\&{*$_}, $module) } keys %{"$module\::"}
}

다른 팁

클래스 :: 검사관:

클래스 :: 검사관을 사용하면로드 된 클래스에 대한 정보를 얻을 수 있습니다. 이 정보의 대부분 또는 전부는 다른 방식으로 찾을 수 있지만 항상 매우 친절한 것은 아니며 일반적으로 비교적 높은 수준의 Perl Wizardry 또는 이상하고 특이한 코드를 포함합니다. 클래스 :: 검사관은이 정보에보다 쉽고 친근한 인터페이스를 제공하려고 시도합니다 ...

이것을 살펴보십시오 :클래스 :: 스니프

인터페이스는 현재 다소 임시이며 변경 될 가능성이 높습니다. 새 인스턴스를 만든 후 보고서 방법을 호출하는 것이 가장 좋습니다. 그런 다음 시각적으로 검사하여 잠재적 인 문제를 찾을 수 있습니다.

my $sniff = Class::Sniff->new({class => 'Some::Class'});
print $sniff->report;

이 모듈은 프로그래머가 객체 지향 코드에서 '코드 냄새'를 찾도록 도와 주려고 시도합니다. 무언가를보고한다고해서 코드가 잘못되었음을 의미하지는 않습니다. 그것은 단지 당신이 당신의 코드를 조금 더 자세히보고 싶을 수도 있음을 의미합니다.

현재, 우리는 Perl의 기본값이 가장 왼쪽으로 왼쪽, 깊이 우선 검색 순서를 가정합니다. 우리는 앞으로 이것을 변경할 수 있습니다 (그리고 경로 방법과의 해결 방법이 있습니다. 나중에 더 자세히 설명합니다) ...

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top