2016-06-12 2 views
0

Чтобы обобщить мою проблему, я не собираюсь копировать/вставлять код, а писать простой код. У меня 3 файла, A.pm, B.pm C.pm.Как получить текущее значение объекта в другом файле?

В A.pm AI есть класс с конструктором:

package A; 
use strict; 
use warnings; 

sub new { 
    my $proto = shift; 
    my $class = ref($proto) || $proto; 
    my $self = {}; 
    $self->{NAME} = "Bob"; 
    bless ($self, $class); 
    return $self; 
} 

В моем файле B.pm, у меня есть:

package B; 
use strict; 
use warnings; 
use A; 
our $MyObjectA = new A(); 
sub myfunctionB { 
$MyObjectA->{NAME} = "Angel"; 
} 

В файле C.pm :

package C; 
use strict; 
use warnings; 
use B; 

sub myfunctionC { 
    print("There is the name of my Object".$B::MyObjectA->{NAME}."\n"); 
} 

В главном p.pl

use strict; 
use warnings; 
use B; 
use C; 

B::myfunctionB(); 
C::myfunctionC(); 

Результаты: подпрограмма C печать Боб, но я хотел бы, чтобы отобразить Angel. Как я могу сделать?

+1

Ваш код печатает 'Существует имя моего ObjectAngel', как вы просили. Что вы еще хотите? – Borodin

ответ

3

Прежде чем получить имя объекта, позвоните по номеру B::myfunctionB().

+0

Это было бы слишком просто. Я хочу, чтобы подпрограмма C знала, что я обновил значение имени в файле C, не указав ему явно. Может быть, я должен изменить ссылку. Я не знаю ... –

+0

@ A.Fab: Ваша подпрограмма 'myfunctionC' просто печатает текущее поле имени объекта. Не нужно «знать», что оно обновлено. Пожалуйста, уточните, что вы хотите – Borodin

+0

@ A.Fab: Без вызова myfunctionB вы не обновили значение, вы только предоставили способ сделать это. – choroba

0

Основная проблема здесь заключается в том, что имеется модуль CPAN с именем B. Таким образом, чтобы переопределить загрузки этого модуля на месте свой собственный, вы можете поместить текущий каталог в начале @INC с помощью lib прагму:

A.pm

package A; 
use strict; 
use warnings; 

sub new { 
    my $proto = shift; 
    my $class = ref($proto) || $proto; 
    my $self = {}; 
    $self->{NAME} = "Bob"; 
    bless ($self, $class); 
    return $self; 
} 

1; 

B.pm

package B; 
use strict; 
use warnings; 
use A; 
our $MyObjectA = A->new(); 

sub myfunctionB { 
$MyObjectA->{NAME} = "Angel"; 
} 

1; 

C.pm

package C; 
use strict; 
use warnings; 
use lib '.'; 
use B; 

sub myfunctionC { 
    B::myfunctionB(); 
    print("The name of my Object: " 
      . $B::MyObjectA->{NAME} 
      . "\n" 
    ); 
} 

1; 

p.pl

use strict; 
use warnings; 
use C; 

C::myfunctionC(); 

Выход работает p.pl:

The name of my Object: Angel 
+0

Я использую другие языки, и я новичок в perl. Я забыл сказать, что мы вызываем функцию Б перед функцией С. И я хочу, чтобы C знал, что я обновил значение имени. –

+0

Я обновил свою тему, возможно, было бы легче понять. –

+0

@ A.Fab Great .. Я только что проверил ваш обновленный код и вывел 'Angel' не' Bob'. Поэтому я не вижу проблемы. (Примечание: мне пришлось добавить 'use lib '.''для загрузки модуля' B', а не основного модуля, также называемого 'B') –

Смежные вопросы