Perlのモジュールファイルからすべての変数、モジュール、および関数名を抽出するためのツールはありますか?

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

  •  20-09-2019
  •  | 
  •  

質問

私の謝罪をこれが重複している場合。私はを検索するための適切な用語を知らないかもしれません。

Iは、大規模なアプリケーションのフラグメントであるPerlモジュールファイル(.PM)を分析を担当しています。単にコードを通過すると、すべての変数名、モジュール名、および関数呼び出しを引き出しますツール、アプリ、またはスクリプトはありますか?さらに良いことに、それは、このファイル内で宣言または外部のものですされたかどうかを同定するものになるだろう。

このようなツールは存在していますか?私は一つだけのファイルを取得するので、これは私が実行できるものではありません - 。私は推測するだけでいくつかの基本的な静的解析

役に立ちましたか?

解決

新をチェックしますが、うまく推奨 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名前空間(デフォルト1)にアクセスするには:

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

あなたのパッケージがマイ/ Package.pmという名前、および名前空間My::Packageにこれでされている場合は、同じ効果を達成するために%main::する%My::Package::を変更します。シンボルテーブル上のはperldoc perlmodをのエントリを参照してください - 彼らはそれを説明し、彼らがリストアップより良い、または少なくとも得ることができ、いくつかの選択肢は、あなたが仕事のための右のモジュールを見つけることに始めた(つまり、Perlのモットーです - それを行うには複数のモジュールがあります)。

あなたが分析している任意のコードを実行せずにそれをしたい場合は、

は、<のhref =「http://search.cpan.org/dist/PPI」のrel =「nofollowをnoreferrer」でこれを行うにはかなり簡単です> PPIする。私のモジュール::使用::エキスをチェックしてください。それは、コードの短いビットを使用して、PPIのPerlDOMから必要要素の任意の並べ替えを抽出する方法を示しますです。

あなたはすでにコンパイルしたコードでそれを行うにしたい場合は、

、答えの他の提案が優れています。

scroll top