rom*_*das 6 perl static-analysis module
如果这是重复,我道歉; 我可能不知道要搜索的正确术语.
我的任务是分析一个Perl模块文件(.pm),它是一个更大的应用程序的片段.是否有工具,应用程序或脚本只需通过代码并提取所有变量名称,模块名称和函数调用?更好的是能够识别它是在该文件中声明还是外部的东西.
这样的工具存在吗?我只得到一个文件,所以这不是我可以执行的东西 - 我想是一些基本的静态分析.
Rob*_*t P 10
看看新的,但很好的建议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";
}
Run Code Online (Sandbox Code Playgroud)
这将让你大部分时间到达那里.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;
Run Code Online (Sandbox Code Playgroud)
请注意,这将输出:
...
'new',
'new',
'new',
'output',
'new',
'new',
'new',
'new',
'new',
...
Run Code Online (Sandbox Code Playgroud)
因为在中定义了多个类HTML/Template.pm
.显然,一种不那么天真的方法可以以分层方式使用PDOM树.
另一种可用的CPAN工具是Class :: Inspector
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' );
Run Code Online (Sandbox Code Playgroud)
这将给你类似于Class :: Sniff的结果; 您可能仍需要自己进行一些处理.
归档时间: |
|
查看次数: |
691 次 |
最近记录: |