7

如果我有use很多模块的 Perl 代码,是否有一种快速简便的方法可以找出其中一些模块是否不是纯 Perl 模块?

4

3 回答 3

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; }
于 2013-01-02T17:25:25.747 回答
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!' ); }
}
于 2013-01-02T17:29:47.967 回答
-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);
于 2013-01-02T18:03:13.123 回答