任何人都可以在这里发现错误吗?我有一个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行中止。
谢谢
答案 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
这是不正确的,因为在解析名称空间时文件系统层次结构是相关的。我建议您正确安装模块,而不是将文件复制到目录中。您可以使用cpan
或cpanm
来安装模块,也可以使用local::lib
安装到自定义模块位置。