2013-03-28 47 views
6

我知道在以太网中有这样的几个问题,但我无法解决我的问题。也许我应该改善我的横向思维。Perl对象错误:无法通过程序包找到对象的方法

我有一个模块,我正在测试。这个模块看起来类似:

package MyModule; 
use strict; 
use warnings; 

... # a bunch of 'use/use lib' etc. 

sub new { 
    my $class = shift; 
    my ($name,$options) = @_; 

    my $self = { 
     _name  => $name, 
     _features => $options, 
     _ids  => undef, 
     _groups => undef, 
     _status => undef, 
    }; 
    bless $self,$class; 
    return $self; 
} 

sub init { 
    my ($self) = @_; 
    my ($ids,$groups,$status) = ...; # these are from a working module 
    $self->{_ids} = $ids; 
    $self->{_groups} = $groups; 
    $self->{_status} = $status; 
    return $self; 
} 

这是我的测试文件:

#!/usr/bin/perl -w 

use strict; 
use MyModule; 
use Test::More tests => 1; 
use Data::Dumper; 

print "Name: "; 
my $name; 
chomp($name = <STDIN>); 
print "chosen name: $name\n"; 

my %options = (
    option1 => 'blah blah blah', 
    option2 => 'blu blu blu', 
); 

my $name_object = MyModule->new($name,\%options); 
print Dumper($name_object); 
isa_ok($name_object,'MyModule'); 

$name_object->init; 
print Dumper($name_object); 

现在,它的工作原理下到isa_ok,但随后出现:

Can't locate object method "init" via package "MyModule" at test_MyModule.t line 31, <STDIN> line 1.

这只是现在我正在尝试使用对象(并且看起来有些失败)。所以我认为我误解了Perl中的对象的应用程序!任何帮助,将不胜感激...

+0

线31了'init'线清晰 – dgBP

+1

问题是你不向我​​们展示了部分代码。 –

+4

我没有运行代码的问题(除了在模块末尾缺少1;)。你确定在@INC路径中没有其他模块名称为MyModule吗?检查%INC以确保您加载了正确的模块。 – imran

回答

6

我想你正在加载一个不同的文件,而不是你认为你正在加载的文件。

print($INC{"MyModule.pm"}, "\n"); 

会告诉你你实际加载了哪个文件。 (如果模块名称的格式为Foo::Bar,请使用$INC{"Foo/Bar.pm"}。)确保package的大小写与文件名匹配。

-5

一定有你的类中此行的正确的地方:

use Moose; 
+2

为什么这个问题有关?你能解释一点吗? – PatomaS

+1

Whiich正确的地方? –

相关问题