如何判断使用的模块是否为纯Perl?

7

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


2
你为什么想知道?你试图检测什么问题? - Andy Lester
那只是我突然想到的,不是当前的问题。 - sid_com
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; }

我接受了这个答案,因为它看起来更可靠,并且输出更好。Axeman的解决方案可能更容易使用,但是当我尝试使用JSON运行他的解决方案时,出现了错误消息:“尝试重新加载B.pm已中止”。 - sid_com
1
是的,它显示了Text::CSV_XS。但是我认为如果Text::CSV_XS不可用,Text::CSV会使用纯Perl版本。 - sid_com
1
@sid_com,Text::CSV 实际上并不执行任何操作。它是 Text::CSV_XS 和 Text::CSV_PP 的前端。如果 Text::CSV_XS 可用,则使用它,否则使用 Text::CSV_PP。 - ikegami
JSON是否与Text::CSV在XS版本与PurePerl版本方面有类似的行为? - sid_com
1
该模块使用JSON::XS或JSON::PP将Perl数据结构转换为JSON格式,反之亦然。 - ikegami
显示剩余2条评论

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!' ); }
}

@ikegami,当然,这不是问题所问的,是吗?“有没有快速简便的方法来找出这些模块中是否有非纯Perl模块?”“纯”是绝对的。如果某些东西无法成为纯“X”,那么它与约束条件相差多少次并不重要。其次,您对我的评论的评论不值得评论。 - Axeman
歪曲他所说的话并不能改变他所问的问题。你的代码没有显示他使用的哪些模块不是纯 Perl 的。最好的情况下,它只显示了一个。 - ikegami
只是澄清一下:Some <=> 大于0。"Some of this [sic] modules" <=> "至少一个"。 - Axeman
我不确定你刚才发布的胡言乱语是什么意思,但如果你试图证明你的代码行为是正确的,那就必然是错误的。你的代码最多只能找到一个XS模块。操作可能有多个。他明确表示他正在处理许多模块,其中任何一个都可能是XS模块。 - ikegami
实际上,他根本没有要求打印任何东西,更不用说死亡了。我的回答不仅给出了他实际要求的是/否答案,还获取了他肯定需要的XS模块的实际列表。我的回答有什么问题吗?而你的回答两者都没有做到。 - ikegami

-4
如果您想尝试查看哪些 Perl 程序模块尚未安装在您的计算机上,可以按照以下步骤进行:
use ExtUtils::Installed;
my $installed = ExtUtils::Installed->new();
my @miss;
foreach $module ($installed->modules()){
    @miss = $installed->validate($module);  
}
print join("\n", @miss);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接