如何判断使用的模块是纯粹的perl?

sid*_*com 7 perl module

如果我有use许多模块的Perl代码,是否有一种快速简便的方法来确定这些模块是否不是纯粹的Perl模块?

ike*_*ami 7

@DynaLoader::dl_modules 包含已加载的XS模块列表.

perl -MSome::Module1 -MSome::Module2 -M... \
   -MDynaLoader -E'say for sort @DynaLoader::dl_modules;'
Run Code Online (Sandbox Code Playgroud)

或者,如果您想将其编写为脚本:

# 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;
Run Code Online (Sandbox Code Playgroud)

当然,没有什么能阻止你把它放在现有的脚本中.

use 5.010;
use DynaLoader qw( );
END { say for sort @DynaLoader::dl_modules; }
Run Code Online (Sandbox Code Playgroud)


Axe*_*man 7

这看起来像我称之为"爆炸传感器"的工作.你可以通过把它放在第一个模块的顶部来boobytrap钩子:

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!' ); }
}
Run Code Online (Sandbox Code Playgroud)