Perl模块的使用

9

我正在尝试在/usr/local/lib/perl中创建自己的Perl模块。

我设置了环境变量PERL5LIB:

$ env | grep PERL
PERL5LIB=/usr/local/lib/perl

如果我创建一个模块:$PERL5LIB/My/ModuleTest.pm
$ ./test.pl 
Can't locate object method "new" via package "My::ModuleTest" (perhaps you forgot to load "My::ModuleTest"?) at ./test.pl line 8.

test.pl:

#!/usr/bin/perl

use strict;
use warnings;
use My::ModuleTest;

my $test = new My::ModuleTest;
print $test->check;

ModuleTest.pm:

package ModuleTest;

use strict;
use warnings;

sub new {
        my $class = shift;
        my ($opts)= @_;
        my $self = {};
        $self->{test} = "Hello World";

        return bless $self, $class;
}
sub check {
        my $self = shift;
        my ($opts) = @_;

        return $self->{test};
}
1;

我希望使用$PERL5LIB作为我的模块库路径,以将它们与安装目录分开。

Perl @INC:

$ perl -le 'print foreach @INC'
/usr/local/lib/perl
/usr/lib/perl5/site_perl/5.8.8/i386-linux-thread-multi
/usr/lib/perl5/site_perl/5.8.8
/usr/lib/perl5/site_perl
/usr/lib/perl5/vendor_perl/5.8.8/i386-linux-thread-multi
/usr/lib/perl5/vendor_perl/5.8.8
/usr/lib/perl5/vendor_perl
/usr/lib/perl5/5.8.8/i386-linux-thread-multi
/usr/lib/perl5/5.8.8
.

看起来有点奇怪:my $test = new My::ModuleTest; - Øyvind Skaar
2
Oyvind:它可以工作,但大多数Perl狂热者会建议您使用my $test = My::ModuleTest->new();来避免某些陷阱。 - Konerak
2个回答

10

尝试在你的文件ModuleTest.pm中使用完整名称 My::ModuleTest 的包.


2
谢谢。顺便说一句,问题很好 - 所有必要的信息都在那里,你展示了你尝试过的所有东西,让我们能够重新创建这种情况,格式完美...你应该得到快速的答案:] - Konerak
最后一个问题,root用户必须拥有PERL5LIB环境变量吗?还是它会将/usr/local/lib/perl作为其路径的一部分? - Mose
@user196096:好问题 - 这就是为什么stackoverflow上的其他人已经问过它了(链接),并且已经得到了答案!:] - Konerak

3

将模块的第一行更改为

package ModuleTest;

to

package My::ModuleTest;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接