2015-12-09 3 views
0

Мне хорошо известно, что есть несколько вопросов по подобным темам, но я не вижу, как применить ответы на мою проблему: < Не удается найти метод объекта «idx» через пакет «1»>Не удается найти метод объекта XX через пакет «1»

Я не понимаю, что я использую одну и ту же архитектуру в двух пакетах и ​​что это нормально в первом ... Где находится пакет «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

'ObjB :: new' выглядит подозрительно –

ответ

4

Obj::new - это метод, но вы называете его подпрограммой.

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

Это приводит к значению первого поля строки используется в качестве класса, и это значение, возможно, 1. Возможно, вы использовали

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

Хорошо, спасибо, все прошло отлично! (Но я до сих пор не понимаю тонкости: я использовал ObjA :: new() в основном файле проекта, и ошибка не была поднята ... Разница между контекстом main и классом?) –

+3

Пара ошибки в сочетании, чтобы дать правильный результат. 'ObjA :: new()' неверно, но поскольку вы не передали никаких аргументов, '$ class' закончил' undef', и 'bless' взял это, чтобы означать, что вы имели в виду текущий пакет (' ObjA'). Другими словами, 'ObjA :: new()' happend эквивалентен ObjA :: new ('ObjA') ', который оказался эквивалентным' ObjA-> new() '. Но это не всегда так; вам просто повезло. – ikegami

+1

Спасибо, приятно иметь объяснение с решением, я получаю его сейчас! (Это все меня: кратковременно повезло ...) –