【问题标题】:Running Perl Scripts on servers that don't have the modules在没有模块的服务器上运行 Perl 脚本
【发布时间】:2012-11-28 02:56:37
【问题描述】:

我需要运行一个 perl 脚本来收集将在不同的 unix 服务器上部署和执行的系统信息。

现在我正在编写并测试它,我收到了这个错误。

无法在 @INC 中找到 XML/DOM.pm(@INC 包含:/usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) 在 test.pl 第 7 行。BEGIN 失败--编译在 test.pl 第 7 行中止。

所以我只是使用 XML::DOM,它应该是 Perl 的一部分,但它不适用于 5.10.1 这个特定服务器上的这个版本。

无论如何,有没有一种方法可以创建和设计我的脚本并将模块打包到其中,同时保留 .pl 扩展名,这是该脚本的要求?

【问题讨论】:

    标签: perl package


    【解决方案1】:

    考虑安装 perlbrewcpanminus,而不是像 amon 建议的那样使用 lib 编译指示,它们旨在协同工作以添加和/或更新模块。

    perlbrew 旨在通过在您的 Perl 脚本中指定 #!/usr/bin/env perl 作为解释器行,同时在您的 ${HOME}/.bash_profile 中添加类似 source ~/perl5/perlbrew/etc/bashrc 的行来定位您想要的本地版本的 Perl 来利用。

    【讨论】:

      【解决方案2】:

      您可以将模块放在任何目录中,然后通过the lib pragma将该目录包含在搜索模块中。请注意,模块Foo::Bar 必须在文件MY-ROOT/Foo/Bar.pm 中,并且可能不在MY-ROOT/Bar.pm 中,其中MY-ROOT 是您的模块目录。

      use lib 'MY-ROOT';
      use Foo::Bar;
      

      但是,这只适用于纯 Perl 模块,不支持 XS。

      【讨论】:

        【解决方案3】:

        如果模块不需要编译库,您可以通过将模块中的文本复制到 .pl 文件中来包含它们。这是一个可怕的 hack,但它应该可以工作。

        Perl 模块应该包含一个 package 语句,给出它们的名字。当您进入主程序部分时,您需要自己的 package main; 语句。

        【讨论】:

        • 您可以使用 App::FatPacker 自动执行此操作,但 XML::DOM 具有 XS 依赖项。
        • 是的。看起来它使用 expat。
        • @envinyater:这行不通。您需要找到一个仅使用 Perl 的 XML 模块,或者您需要找到一种方法来解压缩包含模块和库的目录树,而不是使用单个 .pl 文件。
        猜你喜欢
        • 1970-01-01
        • 2016-11-28
        • 2015-02-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-09
        相关资源
        最近更新 更多