【问题标题】:How to find the location of a Perl module on a Linux server?如何在 Linux 服务器上找到 Perl 模块的位置?
【发布时间】:2017-05-11 06:13:04
【问题描述】:

我们将旧服务器上的所有内容都移到了新服务器上。我们新服务器上的一个网站使用 Perl 后端。当我在浏览器中访问这个 Perl 站点时,它会引发 500 内部服务器错误。当我像这样从命令行运行 Perl 脚本时:

perl -wc login.pl

我收到此错误:

Can't locate LoadINC.pm

login.pl 的顶部是这样的:

#!/usr/bin/perl

开始 { 使用 LoadINC; }

...

所以看起来我们的新服务器缺少LoadINC Perl 模块。

旧服务器仍在运行,没有此问题。所以我的想法是在旧服务器上找到LoadINC 模块,然后将它放在新服务器上的相同位置。还是有更好的方法?模块是否隐藏在某个二进制文件中?两台服务器上查找 Perl 模块的位置是否不同?

还有一点需要注意,旧服务器上的 Perl 版本是 5.8.8,新服务器上的版本是 5.16.3。

【问题讨论】:

标签: linux perl


【解决方案1】:

如何在 Linux 服务器上找到 Perl 模块的位置?

perl -mFoo::Bar -le'print $INC{"Foo/Bar.pm"}'

perldoc -lm Foo::Bar

在这种情况下,

perl -mLoadINC -le'print $INC{"LoadINC.pm"}'

perldoc -lm LoadINC

所以我的想法是在旧服务器上找到 LoadINC 模块,然后将它放在新服务器上的相同位置。还是有更好的方法?

我们应该如何知道如何安装您的模块?

大多数模块都是使用其中之一安装的

perl Makefile.PL
make test
make install

perl Build.PL
./Build test
./Build install

简单地复制文件可能会奏效,但原因有很多。从好的方面来说,您会立即知道它在大多数情况下是否有效。


在两台服务器上查找 Perl 模块的位置是否不同?

搜索的目录列表肯定会不同(考虑到版本的差异),尽管两个版本可能有共同的目录。

独立于架构的模块应该安装在由以下命令的输出命名的目录中:

perl -V:installprivlib

【讨论】:

    【解决方案2】:

    use LoadINC 将查找名为LoadINC.pm 的文件。 Perl 在@INC 中列出的目录中搜索模块。你可以看到他们

    perl -wle 'print for @INC'
    

    @INC 由已编译的目录列表、环境变量 PERL5LIB 的内容、命令行上的任何 -I 选项以及运行代码可能做出的任何更改组成。

    您可以向perldoc 询问与模块名称匹配的文件的位置:

    perldoc -lm LoadINC
    

    如果可以加载模块,也可以问perl本身:

    perl -wle 'use LoadINC (); print $INC{"LoadINC.pm"}'
    

    %INC 是将已加载模块的基本名称映射到其路径的哈希值。)

    【讨论】:

    • 这可能会回答标题中的问题,但问题提出了一个完全不同的问题
    【解决方案3】:

    一种方法:

    $ perldoc -lm open
    /usr/lib/perl5/5.24.1/open.pm
    

    或者大锤法:

    $ locate -r open.pm$
    /usr/lib/perl5/5.24.1/open.pm
    

    但是TMTOWTDI.

    【讨论】:

    • 这可能会回答标题中的问题,但问题提出了一个完全不同的问题
    猜你喜欢
    • 2021-06-22
    • 1970-01-01
    • 2010-12-06
    • 1970-01-01
    • 1970-01-01
    • 2012-06-16
    • 2020-04-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多