6

我目前正在开发一个大约有 15 年历史的 Web 应用程序。

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

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

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

我的问题是:

  • 您是否知道任何CPAN 模块可以帮助我获得仅包含used 和required 模块的列表?
  • 如果您想摆脱所有额外的代码,您的方法是什么?

我在考虑以下方法:

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

3 回答 3

5

Devel::Modlist可能会给你你需要的东西,但我从未使用过它。

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

END {
    open my $log_fh, ...;
    print $log_fh "$_\n" for sort keys %INC;
}
于 2012-05-25T15:02:32.940 回答
2

作为第一个近似值,我会简单地运行

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

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

您也可以@INC尝试排除某些库路径。

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

于 2012-05-25T13:54:39.863 回答
2

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

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

于 2012-05-25T15:31:53.573 回答