清理庞大的Perl Codebase

时间:2012-05-25 13:34:05

标签: perl web-applications cgi code-cleanup

我目前正在处理一个大约15年的Web应用程序。

它主要包含带有 HTML :: Template 模板的 CGI perl脚本。

它有超过12 000个文件和大约260 MB的总代码。我估计不需要超过1500个perl脚本,我想摆脱所有未使用的代码。

实际上没有为代码编写测试。

我的问题是:

  • 您是否知道任何 CPAN模块可以帮助我获取仅use d和require d模块的列表?
  • 如果你想摆脱所有额外的代码,你的方法是什么?

我正在考虑以下方法:

  • 尝试使用在特定位置输出已加载文件名的内容来覆盖userequire perl内置
  • 覆盖warnings和/或strict模块import功能,并在特定位置输出文件名
  • 研究Devel::Cover perl模块并采用相同的方法并在进行手动测试而不是自动化测试时分析代码
  • 将perl可执行文件替换为自定义文件,它将记录它读取的文件的每个名称(我不知道该怎么做)
  • lsof(?!?)
  • 的一些创造性使用

3 个答案:

答案 0 :(得分:5)

Devel::Modlist可能会为您提供所需,但我从未使用过它。

我需要做几次这样的事情,我选择了在程序结束时检查%INC的更强力方法。

END {
    open my $log_fh, ...;
    print $log_fh "$_\n" for sort keys %INC;
}

答案 1 :(得分:2)

作为第一个近似值,我只需运行

egrep -r '\<(use|require)\>' /path/to/source/*

然后花几天时间清理那里的输出。这将为您提供所使用或所需的所有模块的列表。

您也可以使用@INC来排除某些库路径。

如果您正在尝试确定执行路径,则可以通过调试器运行代码,并启用“trace”(即调试器中的“t”),然后将输出重定向到文本文件以进一步分析。我知道运行CGI时很难...

答案 2 :(得分:2)

假设打开了相关的时间戳,您可以检查各种脚本文件的访问时间 - 这应该排除任何未使用的顶级脚本文件。

可能值得为CGI.pm添加一些工具来记录当前的脚本名称($ 0)以查看发生了什么。