我如何知道Perl模块是核心还是标准安装的一部分?

我如何检查Perl模块是否是核心的一部分 - 即它是标准安装的一部分?

我在找:

  • 一个命令行命令:
  • 一个Perl子程序/函数来检查代码
  • 也许这个问题应该是:我怎样才能知道在一台机器上最初提供了哪些模块与特定的Perl安装? (实际上,现在被问到如何知道在一台机器上最初提供哪些模块与特定的Perl安装?)

    鉴于现在似乎不是一个完整的Perl标准安装,至少这个新问题的答案会告诉我最初安装时我最初的安装情况。

    有了这些知识,如果我保留原始的安装程序映像/软件包或知道如何再次在线获取确切的东西,那么我将为几台机器安装一个可重复的Perl安装程序,并知道哪些模块将存在以及哪些模块不会。

    为了进一步阐明:我正在查看最初安装的内容,提供了哪些模块作为安装的一部分,以及内置内容。 不是从那以后安装的。

    我希望能够在安装的机器上执行此操作。 所以为此,我将依靠安装以某种形式记录它最初的内容。

    我问了一个分拆的问题:我怎么知道在一台机器上最初提供了哪些模块与特定的Perl安装? (我怎么知道在一台机器上最初提供了哪些模块与特定的Perl安装?)


    来自Module :: CoreList模块的corelist命令将确定模块是否为Core。

    > corelist Carp
    
    Carp was first release with perl 5
    
    > corelist XML::Twig
    
    XML::Twig was not in CORE (or so I think)
    

    这是在脚本中使用它的一种方法。 Module::CoreList POD太简洁了 - 你必须通过源代码去寻找要调用的方法:

    use strict;
    use warnings;
    use Module::CoreList;
    
    my $mod = 'Carp';
    #my $mod = 'XML::Twig';
    my @ms = Module::CoreList->find_modules(qr/^$mod$/);
    if (@ms) {
        print "$mod in coren";
    }
    else {
        print "$mod not in coren";
    }
    
    __END__
    
    Carp in core
    

    真的没有像“核心”这样的东西了。 过去有一个标准的Perl发行版,但很多人没有标准的Perl发行版。 操作系统发行版通过添加或删除模块,更改模块等来修改它。 你不能依赖标准分配实际上是标准的。 一些Linux发行版甚至不包括Perl文档作为基本Perl安装的一部分。

    你提到你不能使用Module :: CoreList,因为它不是核心,但是如果你可以创建文件,你可以安装模块。 你甚至可以假装自己写了它。


    你可以在sub中检查perlmodlib

    my %_stdmod;
    sub is_standard_module {
      my($module) = @_;
    
      unless (keys %_stdmod) {
        chomp(my $perlmodlib = `perldoc -l perlmodlib`);
        die "cannot locate perlmodlibn" unless $perlmodlib;
    
        open my $fh, "<", $perlmodlib
          or die "$0: open $perlmodlib: $!n";
    
        while (<$fh>) {
          next unless /^=headds+Pragmatics+Modules/ ..
                      /^=headds+CPAN/;
    
          if (/^=items+(w+(::w+)*)/) {
            ++$_stdmod{ lc $1 };
          }
        }
      }
    
      exists $_stdmod{ lc $module } ? $module : ();
    }
    

    用法示例:

    die "Usage: $0 module..n" unless @ARGV;
    
    foreach my $mod (@ARGV) {
      my $stdmod = is_standard_module $mod;
      print "$0: $mod is ", ($stdmod ? "" : "not "), "standardn";
    }
    

    输出:

    $ ./isstdmod threads::shared AnyDBM_File CGI LWP::Simple
    ./isstdmod: threads::shared is standard
    ./isstdmod: AnyDBM_File is standard
    ./isstdmod: CGI is standard
    ./isstdmod: LWP::Simple is not standard

    perldoc绝对是Perl的真正核心和标准安装的一部分。 例如,perl-5.10.1的源代码分发包含

  • perldoc.PL ,生成perldoc作为标准安装的一部分
  • perlmodlib.PL ,生成perlmodlib.pod作为标准安装的一部分
  • 这不是一个新的增加。 大约十年前的Perl-5.6.0将perlmodlib作为其真正核心标准安装的一部分。

    不包含这些项目的安装是非标准的。 是的,我明白,从您的角度来看,这可能看起来很有学术价值,但您的供应商的包装允许使用非标准安装来打破其他工作程序。

    使用Debian的包管理器,您可以使用标准的Perl安装

    $ apt-get --install-recommends install perl
    链接地址: http://www.djcxy.com/p/54579.html

    上一篇: How can I tell if a Perl module is core or part of the standard install?

    下一篇: How can I recursively delete all .svn directories using Perl?