gpt4 book ai didi

perl - 查找未使用的 "use' d"Perl 模块

转载 作者:行者123 更新时间:2023-12-03 23:53:34 25 4
gpt4 key购买 nike

我正在研究一个非常大、非常古老的“历史悠久”的代码库。过去经常有人想“哦,我可能需要这个那个模块,所以我只包含它......”,后来人们经常“缓存”模块内部的数据(“使用ThisAndThat”需要几个几秒钟就可以将数百 MB 从 DB 加载到 RAM,是的,这真是一个愚蠢的想法,我们也在努力)所以,我们经常有一个小模块使用 20 或 30 个模块,其中 90% 是在源本身中完全未使用,并且由于在几个使用的子模块中“缓存”,模块往往需要一分钟甚至更多时间来加载,这当然是 Not Acceptable 。

所以,我试图把它做得更好。现在,我的方式是浏览所有模块,尽可能多地理解它们,然后查看包括它们在内的所有模块,看看是否需要它们。

有没有更简单的方法?我的意思是:有些函数会返回一个模块喜欢的所有子类

...
return grep { defined &{"$module\::$_"} } keys %{"$module\::"}

,那么,没有任何简单的方法可以查看哪些是默认导出的,哪些来自哪里并在其他模块中使用?

一个简单的例子是 Data::Dumper,它几乎包含在每个文件中,甚至当所有调试警告和打印等不再在脚本中时。但是模块仍然必须加载 Data::Dumper。

有什么简单的方法可以检查吗?

谢谢!

最佳答案

以下代码可能是您解决方案的一部分 - 它会显示为 use 的每个实例导入了哪些符号:

package traceuse;
use strict;
use warnings;
use Devel::Symdump;

sub import {
my $class = shift;
my $module = shift;

my $caller = caller();

my $before = Devel::Symdump->new($caller);

my $args = \@_;
# more robust way of emulating use?
eval "package $caller; require $module; $module\->import(\@\$args)";

my $after = Devel::Symdump->new($caller);

my @added;
my @after_subs = $after->functions;
my %before_subs = map { ($_,1) } $before->functions;
for my $k (@after_subs) {
push(@added, $k) unless $before_subs{$k};
}

if (@added) {
warn "using module $module added: ".join(' ', @added)."\n";
} else {
warn "no new symbols from using module $module\n";
}
}
1;

然后只需将“use module ...”替换为“use traceuse module ...”,您将获得已导入函数的列表。

使用示例:
package main;

sub foo { print "debug: foo called with: ".Dumper(\@_)."\n"; }

use traceuse Data::Dumper;

这将输出:
using module Data::Dumper added: main::Dumper

即您可以分辨出哪些函数是以稳健的方式导入的。您可以轻松地扩展它以报告导入的标量、数组和散列变量 - 查看 Devel::Symdump 上的文档.

确定实际使用哪些函数是等式的另一半。为此,您可能可以通过源代码的简单 grep 来逃脱 - 即 Dumper出现在不在 use 上的模块源代码中线。这取决于您对源代码的了解。

笔记:
  • 可能有一个模块可以执行 traceuse 的操作 - 我还没有检查
  • 可能有更好的方法来模拟另一个包中的“使用”
  • 关于perl - 查找未使用的 "use' d"Perl 模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13219442/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com