Perl의 주어진 개체 또는 패키지에 사용 가능한 메소드를 어떻게 나열합니까?

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

  •  05-09-2019
  •  | 
  •  

문제

Perl의 주어진 개체 또는 패키지에 사용 가능한 메소드를 어떻게 나열합니까?

도움이 되었습니까?

해결책

foo라는 패키지가 있으면 다음을 수행해야합니다.

no strict 'refs';
for(keys %Foo::) { # All the symbols in Foo's symbol table
  print "$_\n" if exists &{"Foo::$_"}; # check if symbol is method
}
use strict 'refs';

또는 모든 방법의 목록을 얻으려면 다음과 같습니다.

no strict 'refs';
my @methods = grep { defined &{$_} } keys %Foo::;
use strict 'refs';

다른 팁

Perl에서는 일을하는 방법이 너무 많기 때문에 Perl 에서이 작업을 수행하는 방법에는 여러 가지가 있습니다. 누군가가 언급했듯이 자동로드 된 방법은 항상 약간 까다로울 것입니다. 그러나 자신의 접근 방식을 굴리는 대신 나는 당신이 클래스 :: 검사관 CPAN에서. 그것은 당신이 다음과 같은 일을 할 수있게 해줄 것입니다.

my $methods =   Class::Inspector->methods( 'Foo::Class', 'full', 'public' );

사용중인 패키지가있는 경우 엘크 합리적으로 간단합니다.

print PackageNameHere->meta->dump;

더 완전한 데이터를 위해 :

use Data::Dumper;
print Dumper( PackageNameHere->meta ); 

당신을 시작할 것입니다. 다른 모든 것에 대해 ->meta 문서화되어 있습니다 클래스 :: mop :: 클래스

당신은 그것없이 패키지에 대한 무스의 선물을 약간의 부작용을 할 수 있습니다.

use Class::MOP::Class;
my $meta = Class::MOP::Class->initialize( PackageNameHere );

그런 다음 무스와 같은 클래스 :: mop 메소드를 사용하십시오.

우선 :

 $meta->get_method_map(); 

무스 사용; #, 그것의 엄청난.

일반적으로 Perl과 같은 역동적 인 언어로는 이것을 할 수 없습니다. 패키지는 찾을 수있는 몇 가지 방법을 정의 할 수 있지만, 사용하기 전까지는 정의가없는 방법을 보충 할 수도 있습니다. 또한 메소드를 호출하더라도 (작동하는) 방법을 정의하지 못할 수도 있습니다. 그것은 역동적 인 언어를 멋지게 만드는 일종의 것입니다. :)

어떤 작업을 해결하려고합니까?

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