【问题标题】:Perl module not found, but installedPerl 模块未找到,但已安装
【发布时间】:2012-03-05 18:16:05
【问题描述】:

我通过 cpan 安装了 Perl 模块 HTML::Template。 Perl 本身可以识别 Template 模块,但是当我尝试将其用作 Perl CGI 脚本时,它会触发以下错误:

$ cat /var/log/httpd/error_log

[Tue Feb 14 11:28:27 2012] [error] [client 127.0.0.1] Can't locate HTML/Template.pm in @INC (@INC contains: /root/perl5/lib/perjl5/ /usr/local/lib/perl5 /usr/$
[Tue Feb 14 11:28:27 2012] [error] [client 127.0.0.1] BEGIN failed--compilation aborted at /var/www/cgi-bin/index.pl line 4.
[Tue Feb 14 11:28:27 2012] [error] [client 127.0.0.1] Premature end of script headers: index.pl

我的 Perl 脚本(index.pl)如下:

#!/usr/bin/perl -w

use lib "/root/perl5/lib/perjl5"; # is it the correct way to include libs?
use HTML::Template; # error line


print "Content-type: text/html\r\n\r\n";
print "Hello there!<br />\nJust testing .<br />\n";

for ($i=0; $i<10; $i++)
{
print $i."<br />"; 
}

如果我加载脚本 http://localhost/cgi-bin/index.pl,它会返回 500 内部服务器错误。

模块已安装并位于 /root/perl5/lib/perl5/HTML/Template.pm

事实上,$ perldoc perllocal 返回:

[...]
   [1mMon Feb 13 16:43:34 2012: "Module" HTML::Template[0m
       ·   "installed into: /root/perl5/lib/perl5"

       ·   "LINKTYPE: dynamic"

       ·   "VERSION: 2.6"

       ·   "EXE_FILES: "

[...]

它正确安装了吗? 如果我输入$ perl -e "use HTML::Template,则不会返回任何错误

我正在使用 Fedora 16

Linux 版本 3.2.5-3.fc16.i686 (mockbuild@x86-06.phx2.fedoraproject.org) (gcc 版本 4.6.2 20111027 (Red Hat 4.6.2-1) (GCC) ) #1 SMP Thu Feb 9 02:24:08 UTC 2012

【问题讨论】:

    标签: perl module


    【解决方案1】:

    您的use lib 行有一个额外的j

    use lib "/root/perl5/lib/perjl5";
    #                           ^
    

    所以路径与你后面说的不匹配(“模块已安装并位于:/root/perl5/lib/perl5/HTML/Template.pm”)。

    诊断此问题的方法是从错误消息/root/perl5/lib/perjl5 复制并粘贴目录,然后附加模块的文件名HTML/Template.pm 以提供/root/perl5/lib/perjl5/HTML/Template.pm,然后查看该文件是否存在。

    然后您会看到该文件不存在,然后可以继续确定目录名称中是否存在拼写错误。

    另外,如果您要维护自己的 (CPAN) 库,而不是将 use lib ... 放入所有源文件中,您可能需要考虑使用另一种机制让 perl 使用您的库,例如设置 @ 987654329@ 环境变量(您可以从 shell 的启动文件(例如 ~/.bash_profile)中设置),或使用 perl -I...

    此外,如果您想使用 CPAN,您可能需要查看 local::lib 模块。使用 local::lib 的一种方便方法是安装发行版的 local::lib(例如,在 Debian/Ubuntu 下,apt-get install liblocal-lib-perl),然后使用它来设置您自己的私有 CPAN 库。 (您可以从 CPAN 引导 local::lib,但使用发行版包更容易。)

    【讨论】:

      【解决方案2】:

      我遇到了同样的问题,我发现它是由 perl 的路径引起的。你需要检查你的 perl 路径:

      
      which perl
      

      一定要把它放在第一行! 例如,我在 Mac 中使用终端安装了 HTML:Template,而我的 perl 使用:/opt/local/bin/perl。脚本应该是:

      
      #!/opt/local/bin/perl -wT
      

      【讨论】:

        【解决方案3】:
        #!/usr/bin/perl -w
        print "Content-type:text\html\n\n"; # -> before use lib
        
        use lib "/root/perl5/lib/perjl5"; # is it the correct way to include libs?
        use HTML::Template; # error line   
        
        print "Hello there!<br />\nJust testing .<br />\n";
        
        for ($i=0; $i<10; $i++)
        {
        print $i."<br />"; 
        }
        

        如果您在文件夹 /root/perl5/lib/perjl5 上的模块中打印 html,则在顶部内容类型上打印。 2 个文件夹中的替代单独模块。首先使用lib模块没有打印html

        【讨论】:

        • print 放在use 之前没有任何区别。 use 发生在编译时,因此无论如何都会在 print 之前发生。在开发(但不是生产!)时捕获错误的更好解决方案是CGI::Carp
        猜你喜欢
        • 2020-12-25
        • 1970-01-01
        • 2016-10-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-21
        • 1970-01-01
        相关资源
        最近更新 更多