了解现有perl代码的方法?

时间:2011-02-16 02:21:11

标签: perl documentation reverse-engineering

我有一些perl代码(约300-500行),我必须重新开始工作。我的编程经验有限,通常如果我编码我只是找到对我有意义的最佳解决方案。在这种情况下,我必须使用此代码,因为它是为现有的遗留系统构建的,其代码是系统的布线,逻辑和渲染的文档。这不是很多代码,但我也无法发布甚至大块的代码或数据来获得帮助。什么是理解语法,它正在做什么,代码如何连接,逻辑如何模型等的最佳方法。

问题,反馈,评论 - 只是评论,谢谢!!

6 个答案:

答案 0 :(得分:9)

看书 Perl Medic, Transforming Legacy Code,Peter Scott,2004年。
this perlmonks node列出了一些评论说明,包括目录。
简要回顾是here

这本书涵盖了许多足够深入学习和掌握的技巧。将它们应用于您的问题。如果您只有一点时间,请扫描整本书,然后我推荐第3章关于测试,第4章关于重写,第11章,案例研究(30多页)。

如果您不使用本书,至少要使用perldoc来学习Test :: More和相关模块。通过执行有用的测试来运行原始代码和修改后的代码,可以建立您对更改的信心,因为您可以看到特定更改何时导致测试失败。

更新

有关Perl测试工具的详细数据,请参阅本书,而不是Perl Medic中提供的数据: Perl Testing: A Developer's Notebook,作者:Ian Langworth&色彩,2006。

答案 1 :(得分:7)

前段时间我读了很多关于在perlmonks上快速理解大型项目的文章 - Swallowing an elephant in 10 easy steps。有许多有用的建议可以带来回报。

答案 2 :(得分:6)

查看perltidy等可以规范格式化的工具。

还要考虑在调试器中运行代码,并逐行执行。有关详细信息,请参阅perldoc perldebug

答案 3 :(得分:3)

我的建议是从函数开始...遍历代码,找到使用函数的所有地方,并确定它是否是普遍的常规perl函数,或者它是否是自定义函数。然后搜索代码并找到创建所有自定义函数的位置,并确定每个函数的作用。

在你去的时候给代码添加注释,一旦你弄清楚函数在做什么,添加注释。

仅此一点就可以给你一个良好的开端。

在更多细节方面,您可能希望在此之后进行标记/评论/记录每个perl变量的用途/第一次使用它是什么。

这应该可以让你很好地找出代码...如果有一个功能或其他你无法弄清楚的东西,使用精彩的Google搜索网页...或者在这里发布不一定确切的代码,如你所说,你不能,但大致了解它在做什么。

另外,我忘了提到的一件事是找到任何循环,无论是whilefor等,并确定它们内部运行的内容以及它们循环的内容。

答案 4 :(得分:2)

已经有一些好的建议,另一个是B::Deparse模块,它试图以更清晰的方式重写代码(通常)。

例如,当您对包含此obfuscated code的文件perl -MO=Deparse ob.pl运行ob.pl时:

@P=split//,".URRUU\c8R";@d=split//,"\nrekcah xinU / lreP rehtona tsuJ";sub p{
@p{"r$p","u$p"}=(P,P);pipe"r$p","u$p";++$p;($q*=2)+=$f=!fork;map{$P=$P[$f^ord
($p{$_})&6];$p{$_}=/ ^$P/ix?$P:close$_}keys%p}p;p;p;p;p;map{$p{$_}=~/^[P.]/&&
close$_}%p;wait until$?;map{/^r/&&<$_>}%p;$_=$d[$q];sleep rand(2)if/\S/;print

你得到:

@P = split(??, '.URRUUxR', 0);
@d = split(??, "\nrekcah xinU / lreP rehtona tsuJ", 0);
sub p {
    @p{"r$p", "u$p"} = ('P', 'P');
    pipe "r$p", "u$p";
    ++$p;
    ($q *= 2) += $f = !fork;
    map {$P = $P[$f ^ ord $p{$_} & 6];
    $p{$_} = / ^$P/xi ? $P : close $_;} keys %p;
}
p ;
p ;
p ;
p ;
p ;
map {close $_ if $p{$_} =~ /^[P.]/;} %p;
wait until $?;
map {<$_> if /^r/;} %p;
$_ = $d[$q];
sleep rand 2 if /\S/;
print $_;
ob.pl syntax OK

哪个(可能)更好;我不知道,也许不是。无论如何都值得一试。

编辑:您可以通过将命令更改为perl -MO=Deparse,-p ob.pl来获取更多信息,该命令放入明确的括号,这有助于理解运算符优先级。

答案 5 :(得分:0)

程序中是否有任何评论可以让您知道每行或每项功能的作用?

我会从头到尾完成代码。用笔和很多纸。这个程序的作者应该编写测试用例,这样新的程序员就像你自己一样,可以理解代码是如何工作的。没有多少程序员编写测试用例。