无法通过包“1”

时间:2015-12-09 20:38:58

标签: perl

我很清楚在类似的主题上有几个问题,但我没有看到如何应用我的问题的答案: <无法通过包“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?或者因为它们是在两个不同的文件中声明的?

我真的希望有人能得到答案,因为我一直在圈子里跑......

谢谢!

1 个答案:

答案 0 :(得分:4)

Obj::new是一种方法,但您将其称为子例程。

ObjB::new(split("\t",$line));

这导致该行的第一个字段的值被用作类,该值可能是1。你可能想要使用

ObjB->new(split("\t",$line));