我们维护了大量的 perl 模块,实际上它是如此之大,以至于我们甚至不知道我们负责的所有模块。我们想在某种日志中跟踪哪些脚本和模块访问了另一个模块,最好按模块名称存储,以便我们可以评估更新模块是否存在风险,以便我们知道我们可能会影响什么。
有什么简单的方法可以做到这一点吗?
最佳答案
你可以做一个简单的正则表达式搜索:
use strict;
use warnings;
my %modules;
foreach my $perl_file (@file_list) {
open FILE, $perl_file or die "Can't open $perl_file ($!)";
while (<FILE>) {
if (/\s*(?:use|require)\s*([^;]+);/) {
$modules{$1}{$perl_file}++;
}
}
}
这既快又脏,但它应该工作得很好。您最终会得到一个模块哈希,每个模块都指向使用它的文件的哈希。
当然,它会捕获像
use strict;
这样的东西。但这些很容易被忽略。如果你有
use Module qw/function/;
之类的东西您将在分号之前捕获整个内容,但这应该没什么大不了的。您可以只搜索已知模块名称的键。缺点是它不跟踪依赖关系。如果您需要该信息,您可以通过从 cpan 或其他方式获取它来添加它。
更新:如果你想在运行时记录这个,你可以创建一个包装脚本并让你的
perl
命令指向系统上的包装器。然后使包装器像这样:use strict;
use warnings;
use Module::Loaded;
my $script = shift @ARGV;
#run program
do $script;
#is_loaded() gets the path of these modules if they are loaded.
print is_loaded('Some::Module');
print is_loaded('Another::Module');
但是,由于调用脚本的方法已经改变,您可能会冒着有趣的副作用的风险。这取决于你在做什么。
关于Perl 记录哪些脚本/模块访问了另一个模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13064926/