이 있는 도구를 추출하기 위한 모든 변수,모듈 기능을 이름에서 펄 모듈은 파일입니까?

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

  •  20-09-2019
  •  | 
  •  

문제

죄송하는 경우 이것은 중복된;나는 알 수 없습니다 적절한 용어를 검색한다.

나는 분석하는 업무 펄 모듈은 파일(.동)는 조각의 응용 프로그램.은 거기는 도구,응용 프로그램,또는 스크립트는 것은 단순히 가을 통해 코드를 꺼내 모든 변수 이름,모듈의 이름,기능니다.더 나은 것을 식별하는 것인지 여부를 선언 이 파일 내 또는 외부.

는 이러한 도구가 존재하는가?내가 만나 파일,그래서 이것은 무언가를 실행할 수 있습--단지 몇 가지 기본적인 정적 분석을 나는 생각한다.

도움이 되었습니까?

해결책

새롭지 만 권장되는 것을 확인하십시오 Class::Sniff.

문서에서 :

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

my $num_methods = $sniff->methods;
my $num_classes = $sniff->classes;
my @methods     = $sniff->methods;
my @classes     = $sniff->classes;

{
  my $graph    = $sniff->graph;   # Graph::Easy
  my $graphviz = $graph->as_graphviz();

  open my $DOT, '|dot -Tpng -o graph.png' or die("Cannot open pipe to dot: $!");
  print $DOT $graphviz;
}

print $sniff->to_string;
my @unreachable = $sniff->unreachable;
foreach my $method (@unreachable) {
    print "$method\n";
}

이것은 당신에게 대부분의 길을 얻을 것입니다. 약간 variables, 스코프에 따라 사용할 수 없습니다.

다른 팁

내가 올바르게 이해하면 Perl 소스 코드를 통과 할 수있는 도구를 찾고 있습니다. 나는 제안 할 것이다 PPI.

다음은 문서에서 자만한 예입니다.

#!/usr/bin/perl

use strict;
use warnings;

use PPI::Document;
use HTML::Template;

my $Module = PPI::Document->new( $INC{'HTML/Template.pm'} );

my $sub_nodes = $Module->find(
    sub { $_[1]->isa('PPI::Statement::Sub') and $_[1]->name }
);

my @sub_names = map { $_->name } @$sub_nodes;

use Data::Dumper;
print Dumper \@sub_names;

이것은 출력됩니다.

     ...
     'new',
     'new',
     'new',
     'output',
     'new',
     'new',
     'new',
     'new',
     'new',
     ...

여러 클래스가 정의되기 때문입니다 HTML/Template.pm. 분명히, 덜 순진한 접근법은 pdom 트리와 계층 적 방식으로 작동합니다.

다른 CPAN 도구를 사용할 수 클래스::관리자

use Class::Inspector;

# Is a class installed and/or loaded
Class::Inspector->installed( 'Foo::Class' );
Class::Inspector->loaded( 'Foo::Class' );

# Filename related information
Class::Inspector->filename( 'Foo::Class' );
Class::Inspector->resolved_filename( 'Foo::Class' );

# Get subroutine related information
Class::Inspector->functions( 'Foo::Class' );
Class::Inspector->function_refs( 'Foo::Class' );
Class::Inspector->function_exists( 'Foo::Class', 'bar' );
Class::Inspector->methods( 'Foo::Class', 'full', 'public' );

# Find all loaded subclasses or something
Class::Inspector->subclasses( 'Foo::Class' );

이것은 당신과 유사한 결과를 클래스::냄새;당신은 아직도 해야 할 일 처리합니다.

이 질문에 대한 더 나은 답이 있지만 게시되지 않으므로 서쪽에서 가장 빠른 총을 주장하고 계속해서 '빠른 고정'을 게시 할 것입니다.

이러한 도구는 실제로 존재하며 Perl에 내장되어 있습니다. 특수 해시 변수를 사용하여 모든 네임 스페이스의 기호 테이블에 액세스 할 수 있습니다. 액세스하려면 main 네임 스페이스 (기본 공간) :

for(keys %main::) { # alternatively %::
  print "$_\n";
}

패키지가 My/Package.pm이라는 이름을 사용하는 경우 네임 스페이스에 있습니다. My::Package, 당신은 변할 것입니다 %main:: 에게 %My::Package:: 동일한 효과를 달성합니다. 참조 Perldoc perlmod 기호 테이블에 대한 항목 - 그들은 그것을 설명하고, 더 나은 몇 가지 대안을 나열하거나 최소한 작업에 대한 올바른 모듈을 찾기 시작하게됩니다 (Perl 모토입니다. 하나 이상의 모듈이 있습니다).

분석중인 코드를 실행하지 않고 수행하려면이 작업을 수행하는 것이 매우 쉽습니다. PPI. 내 확인 모듈 :: 사용 :: 추출; 그것은 짧은 코드입니다. PPI의 perldom에서 원하는 모든 종류의 요소를 추출하는 방법을 보여줍니다.

이미 컴파일 된 코드로 수행하려면 답변의 다른 제안이 더 좋습니다.

나는 이것에서 내가 찾고 있던 것에 대한 좋은 대답을 찾았다 Randal Schwartz에 의해. 그는 B :: XREF 모듈을 사용하여 내가 찾고있는 정보를 정확하게 추출했습니다. 모듈의 파일 이름과 함께 사용한 평가 된 하나의 라이너를 챔피언처럼 대체했으며 B :: Xref는 ActiveState Perl과 함께 제공되므로 추가 모듈이 필요하지 않았습니다.

perl -MO=Xref module.pm 
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top