2016-06-12 29 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(); 

結果:子程序Ç打印鮑勃,但我想它顯示天使。我能怎麼做?

+1

你的代碼打印'還有就是我ObjectAngel'爲您所要求的名稱。你還想要什麼? – Borodin

回答

3

之前獲取對象的名字,叫B::myfunctionB()

+0

這太簡單了。我希望子程序C知道我已經更新了文件C中的名字的值,而沒有明確地告訴他。可能是我應該改變參考。我不知道...... –

+0

@ A.Fab:你的子程序'myfunctionC'只是打印對象的當前名字段。它不需要「知道」它已被更新。請更清楚你想要什麼 – Borodin

+0

@ A.Fab:沒有調用myfunctionB,你沒有更新值,你只是提供了一種方法。 – choroba

0

這裏的主要問題似乎是,有一個名爲B一個CPAN模塊。

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:所以重寫裝載該模塊代替你自己的,你可以通過使用lib編譯把當前目錄中的@INC開始

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的初學者。 我忘了說我們在functionC之前調用了functionB。我想讓C知道我已更新名稱值。 –

+0

我已經更新了我的主題,也許這會更容易理解。 –

+0

@ A.Fab好..我剛剛測試了你的更新代碼,它輸出'Angel'而不是'Bob'。所以我看不到問題。 (注意:我必須添加'use lib'。''加載模塊'B'而不是名爲'B'的核心模塊) –

相關問題