我很清楚在类似的主题上有几个问题,但我没有看到如何应用我的问题的答案: <无法通过包“1”>
找到对象方法“idx”我不明白的是,我在两个软件包中使用相同的体系结构,并且在第一个软件包中就可以了......包“1”来自哪里?
以下是可以正常运行的软件包:
package ObjA;
use warnings;
use strict;
use Data::Dumper;
use Carp;
use ObjB;
#CONSTRUCTOR AND INITIALISATION
sub new {
my $class = shift;
my $self = {@_};
bless($self,$class);
$self->language();
return $self;
}
sub load {
my $self = shift;
open (my $stream,"<",$self ->{name});
my @glob_xs=();
my $i = 0;
while (<$stream>){
$i += 1;
my @x = extract($stream,());
@glob_xs=(@glob_tokens,@x);
}
$self->tokens(\@glob_xs);
}
sub extract{
my ($stream,@x) = @_;
my $line = <$stream>;
chomp $line;
if ($line =~ /^\s*$/){
return @x;
}
print join("/",split("\t",$line));
my $b = ObjB::new(split("\t",$line));
push @x,$b->form;
extract_sentence($stream,@x);
}
# OBJECT ACCESSOR METHODS
sub language {$_[0]->{language}=$_[1] if defined $_[1] ; $_[0]->{language}}
1;
这是产生错误的那个:
package ObjB;
use warnings;
use strict;
use Data::Dumper;
use Carp;
# CONSTRUCTOR AND INITIALISATION
sub new {
my $class = shift;
my $self = {@_};
bless($self,$class);
$self->idx(); # Dies here.
return $self;
}
# OBJECT ACCESSOR METHODS
sub idx {$_[0]->{idx}=$_[1] if defined $_[1] ; $_[0]->{idx}}
1;
是不是因为ObjB被称为ObjA?或者因为它们是在两个不同的文件中声明的?
我真的希望有人能得到答案,因为我一直在圈子里跑......
谢谢!
答案 0 :(得分:4)
Obj::new
是一种方法,但您将其称为子例程。
ObjB::new(split("\t",$line));
这导致该行的第一个字段的值被用作类,该值可能是1
。你可能想要使用
ObjB->new(split("\t",$line));