12

我如何知道 Perl 分发了哪些模块?

我的第一个猜测是这里列出的核心模块总是包含在内,尽管我找不到明确说明。但是,我使用了这个集合之外的模块(例如 LWP),而不必在 Mac OS X 和 Linux 上安装它们。

所以稍微完善一下我的问题:

  • 所有 Perl 安装都分发了哪些模块?

并且:我如何找出分发了哪些模块:

  • Linux(尤其是 Debian/Ubuntu)?

  • Mac OS X?

  • 索拉里斯?

在每种情况下,我都使用最新版本的操作系统标配的 Perl 版本。

TIA。

更新:问题的原因是我正在 Mac OS X 和 Linux 上开发以部署到不同的 Linux 和 Solaris,并且我在其中一些系统上没有 root,对于 Mac OS XI 没有甚至有一个编译器AFAIK。所以我想知道我在所有四个部署中都有哪些模块,而无需进一步安装。

4

8 回答 8

15

如果您安装Module::CoreList,命令行程序corelist可以告诉您有关模块及其在不同版本 perl 中的版本的所有信息。您链接到的页面概述了最新版本的 perl。

请注意,默认情况下发行版通常提供比此列表更多的内容,但可以假定此列表无处不在(除非它明确是操作系统相关的模块,例如 Win32)。

于 2009-02-20T23:43:23.130 回答
9

已经给出了正确的直接答案,但我认为你问错了问题。您可能正在尝试仅使用核心模块进行开发。为什么?您这样做可能是因为您不想处理依赖关系。为什么?因为他们可能会让人头疼。但是在没有CPAN的情况下开发 Perl会失去一半的力量。你在折磨自己。这很值得。

更新:既然我对你想要做什么有了更多的了解,我可以回答正确的问题。首先是“当我没有 root 时如何安装模块?” 简单的答案是这样的:

perl Makefile.PL PREFIX=/some/path LIB=/some/path/lib
...and all the rest as normal...

对于基于 MakeMaker 的模块(LIB 用于控制 PREFIX 的不精确性质。首选 INSTALL_BASE,但它不向后兼容)。

这对于 Module::Build

perl Build.PL --install_base=/some/path

然后模块将在 /some/path/lib 中结束,您可以设置PERL5LIB环境变量或use lib qw(/some/path/lib)在您的代码中。

这意味着您可以将依赖模块直接粘贴到您的软件发行版中并发布它们。适用于纯 Perl 模块。对于需要编译器的东西,请查看PAR,因为其他人建议能够发布已编译的可执行文件。

或者,您可以将您的东西作为 CPAN 模块分发,并附上依赖项,然后让 CPAN 客户端解决它们。您甚至可以使用Module::AutoInstall在 CPAN 客户端之外执行此过程。

所以你看,在发布 Perl 应用程序时,你并不局限于只使用核心模块。

于 2009-02-21T08:16:52.087 回答
8

Module::CoreList已经被提及。它带有一个命令行界面,使事情变得简单。如果您已经安装了它,或者有一个程序需要弄清楚特定版本的 Perl 可能没有附带什么,那就太好了。

如果您想知道特定版本的 perl 附带了哪些模块,您可以perldoc perlmodlib在命令行上运行以获得完整列表。对于较旧或较新版本的 Perl,您只需转到CPAN 上的 Perl 页面并从下拉列表中选择您想要的版本(例如,5.6.2),然后导航到perlmodlib文档中的页面。(输入perlmodlib浏览器的文本搜索会有所帮助)。

如果您考虑使用模块,因为它不是旧版本 Perl 的核心,那么您可能希望考虑使用PAR,Perl Archiver来捆绑您的额外依赖项,甚至 Perl 本身!Perl Training Australia 也有一个关于使用 PAR 的 Perl 提示,其中涵盖了开始使用 PAR 的基础知识。

万事如意,

保罗

于 2009-02-21T07:00:50.537 回答
6

要快速查看已安装的模块和版本,请使用 cpan 工具创建自动捆绑包:

 cpan -a

如果您需要更复杂的东西,ExtUtils::Installed 可以为您提供帮助。

曾经有“标准库”的想法,但实际上并不存在。Module::CoreList告诉您“标准库”中有什么,但许多供应商安装了额外的模块,有些甚至删除或更新了模块。此外,Strawberry PerlActivePerl等发行版带有许多奖励模块。

此外,您不需要 root 来安装模块。您只需要 root 即可安装模块,而 root 可以安装模块。perlfaq8为您提供了在任何您喜欢的地方安装模块的所有详细信息。我建议您将所有模块安装在分布式 @INC 目录之外,以便保持分布式 Perl 干净。

祝你好运,

于 2009-03-20T18:39:43.203 回答
1

听起来你想要local::lib。没有 root 的 cpan 的所有好处(并且使系统 perl 保持不变)。

于 2009-03-20T12:09:35.793 回答
0

这方面的一个简单参考在《Beginning Perl 》的附录 D中。当然它适用于 Perl 5.6,但据我所知,Perl 5.8 并没有删除任何这些,只是引入了新的(如 Digest::MD5、File::Temp、Filter::Simple、libnet、List::Util、Memoize , MIME::Base64, Scalar::Util, Storable, Switch, Test::More, Test::Simple, Text::Balanced, Tie::File等)

对于 perl 的每个版本,您可以查看perldoc。这是perl 5.8.8 的列表

于 2009-02-20T23:56:03.117 回答
-1

这个问题现在不那么重要了(我在最终的目标机器上拥有 root 访问权限,所以我只需要安装我需要的包),但如果有人感兴趣,这就是我所做的:

首先,在每个目标系统上运行此代码:

foreach my $dir (@INC) {
    print "Directory: $dir\n";
    if (-d "$dir") {
        my @modules = `find $dir/ -name "*.pm"`;
        foreach my $m (@modules) {
            my $label = $m;
            $label =~ s|\n$||;
            $label =~ s|//+|/|g;
            $label =~ s|^$dir/||;
            print "$label\n";
        }
    }
}

请注意,您需要一个带有 find 命令的 *nix 系统。将输出转储到三个文件中,并排序。然后使用这样的命令(从内存中):

grep -F -x -f list-1.txt list2.txt > list-12.txt
grep -F -x -f list-12.txt list3.txt > list-123.txt

现在 list-123.txt 应该或多或少有共享模块的列表。

值得一提的是,这三个系统都共享了一些额外的模块,尤其是 XML::Parser 模块。

于 2009-03-20T09:04:32.290 回答
-6

查看您的主符号表,它将向您显示所有可用的“标准”包...

print %main::;
于 2009-02-20T23:41:14.603 回答