如果我有use
很多模块的Perl代码,是否有一种快速简便的方法可以找出这些模块是否不是纯粹的Perl模块?
答案 0 :(得分:7)
@DynaLoader::dl_modules
包含已加载的XS模块列表。
perl -MSome::Module1 -MSome::Module2 -M... \
-MDynaLoader -E'say for sort @DynaLoader::dl_modules;'
或者如果你想把它写成一个脚本:
# Usage: script Some::Module1 Some::Module2 ...
use 5.010;
use DynaLoader qw( );
while (defined($_ = shift(@ARGV))) {
s{::}{/}g;
$_ .= ".pm";
require $_;
}
say for sort @DynaLoader::dl_modules;
当然,没有什么可以阻止你把它放在现有的脚本中。
use 5.010;
use DynaLoader qw( );
END { say for sort @DynaLoader::dl_modules; }
答案 1 :(得分:7)
这看起来像我称之为“爆破传感器”的工作。你可以通过把它放在第一个模块的顶部来欺骗钩子:
BEGIN {
require Carp; #Does the stack stuff
# Fool Perl into thinking that these are already loaded.
@INC{ 'XSLoader.pm', 'DynaLoader.pm' } = ( 1, 1 );
# overload boobytrapped stubs
sub XSLoader::load { Carp::confess( 'NOT Pure Perl!' ); }
sub DynaLoader::bootstrap { Carp::confess( 'NOT Pure Perl!' ); }
}
答案 2 :(得分:-4)
如果您必须尝试在您的计算机上尚未安装Perl prog中的哪些模块。你可以这样做:
use ExtUtils::Installed;
my $installed = ExtUtils::Installed->new();
my @miss;
foreach $module ($installed->modules()){
@miss = $installed->validate($module);
}
print join("\n", @miss);