Perl,无法在@INC中找到Packet / UDP / Syslog.pm自定义模块

时间:2014-04-16 06:48:04

标签: perl

任何人都可以在这里发现错误吗?我有一个perl脚本和3个自定义perl模块。我使用导出指定了模块的位置,也使用-I,在脚本中使用:

use lib '/var/pwn/syslog-generator/perl-modules/';
  • 但脚本仍然失败并出现常见错误:

    无法在@INC中找到Packet / UDP / Syslog.pm(@INC包含:/ var / pwn / syslog-generator / perl-modules / ./ / etc / perl / usr / local / lib / perl / 5.14.2 /usr/local/share/perl/5.14.2 / usr / lib / perl5 / usr / share / perl5 /usr/lib/perl/5.14 /usr/share/perl/5.14 / usr / local / lib / site_perl。)在raw-syslog.pl第5行。 BEGIN失败 - 编译在raw-syslog.pl第5行中止。

  • 模块位于此处:

    ls / var / pwn / syslog-generator / perl-modules Packet.pm Syslog.pm UDP.pm

perl -V

Compiled at Sep 30 2013 03:45:34
  %ENV:
    PERL5LIB=":/var/pwn/syslog-generator/perl-modules/"
  @INC:
    /var/pwn/syslog-generator/perl-modules/
    /etc/perl
    /usr/local/lib/perl/5.14.2
    /usr/local/share/perl/5.14.2
    /usr/lib/perl5
    /usr/share/perl5
    /usr/lib/perl/5.14
    /usr/share/perl/5.14
    /usr/local/lib/site_perl

我的perl脚本就是这样开始的:

#!/usr/bin/perl
use strict; use warnings;
use lib './';
use lib '/var/pwn/syslog-generator/perl-modules/';
use Packet::UDP::Syslog;
use POSIX qw/strftime/;
  • 我还尝试用-Idirectory [指定@ INC / #include目录]启动脚本,但是:

    perl -I / var / pwn / syslog-generator / perl-modules raw-syslog.pl 无法在@INC中找到Packet / UDP / Syslog.pm(@INC包含:/ var / pwn / syslog-generator / perl-modules / ./ / var / pwn / syslog-generator / perl-modules / etc / perl /usr/local/lib/perl/5.14.2 /usr/local/share/perl/5.14.2 / usr / lib / perl5 / usr / share / perl5 /usr/lib/perl/5.14 / usr / share / perl /5.14 / usr / local / lib / site_perl。)在raw-syslog.pl第5行。 BEGIN失败 - 编译在raw-syslog.pl第5行中止。

再一次,没有运气。我遗失了一些明显的东西?

谢谢

2 个答案:

答案 0 :(得分:3)

3个文件中有3个模块叫做Packet.pm,Syslog.pm和UDP.pm吗? 他们的顶部分别有package Packet;package Syslog;package UDP;吗?

如果是这样,您需要使用

分别加载其中的每一个
use Packet;
use Syslog;
use UDP;

另一方面,如果您在Packet / Syslog / UDP.pm中有一个文件,那么它必须具有 package Packet::Syslog::UDP;位于顶部,您可以使用

加载它
use Packet::Syslog::UDP;

哦,顺便说一句,如果这取决于你,我强烈建议使用公司或项目特定的模块名称空间。所以我没有'Packet.pm'而是创建一个名为'Company / Packet.pm'的文件,顶部有package Company::Packet;,我会用use Company::Packet;加载它。否则你很容易碰到具有相同名称的模块。

有些文章可能会对这个问题有所了解:

(免责声明:我自己撰写的文章)

答案 1 :(得分:0)

当您use Packet::UDP::Syslog时,Perl会将该名称变为路径Packet/UDP/Syslog.pm。然后它将循环遍历@INC目录并查找匹配项:

/var/pwn/syslog-generator/perl-modules/Packet/UDP/Syslog.pm
/etc/perl/Packet/UDP/Syslog.pm
/usr/local/lib/perl/5.14.2/Packet/UDP/Syslog.pm
/usr/local/share/perl/5.14.2/Packet/UDP/Syslog.pm
/usr/lib/perl5/Packet/UDP/Syslog.pm
/usr/share/perl5/Packet/UDP/Syslog.pm
/usr/lib/perl/5.14/Packet/UDP/Syslog.pm
/usr/share/perl/5.14/Packet/UDP/Syslog.pm
/usr/local/lib/site_perl/Packet/UDP/Syslog.pm
./Packet/UDP/Syslog.pm

如果这些文件都不存在,则找不到该模块。但是,您只有这些文件:

/var/pwn/syslog-generator/perl-modules/Packet.pm
/var/pwn/syslog-generator/perl-modules/Syslog.pm
/var/pwn/syslog-generator/perl-modules/UDP.pm

这是不正确的,因为在解析名称空间时文件系统层次结构是相关的。我建议您正确安装模块,而不是将文件复制到目录中。您可以使用cpancpanm来安装模块,也可以使用local::lib安装到自定义模块位置。