2012-10-31 51 views
1

我做了一個Perl模塊和我仍然得到認真處理的Perl如何與對象交易中的訪問Perl的對象特徵。 這是new子,我寫了創建一個對象,我沒有問題,更新內容:如何從同一個包

sub new { 
    my $class = shift; 
    my ($self) = { 
     name => undef 
    }; 
    bless($self, $class); 
    return $self; 
} 
sub get_name { 
    my $self = shift; 
    $self->{name} = 'Eve'; 
    return $self->{name}; 
} 

我可以使用對象很好,當我調用模塊,並從其他文件訪問,但我想使用模塊代碼中其他區域的對象中的數據。

所以我沒有問題,這樣做:

my $new_object = new ProgramTest; # ProgramTest being the module/package 
my $name = get_name(); 

但我想用$self元素中從未被外部腳本訪問的「模塊內部」的方法。所以我想有這樣的事情:

sub get_variables { 
    return (name); # I don't know how to get the name here 
    # (I plan to have other variables, too) 
} 

我可能失去了一些東西明顯(我敢肯定,我會踢自己,當我看到的解決方案),所以任何幫助表示讚賞! 我想要這樣的模塊的其餘部分可以使用變量(不改變),因爲有條件依賴於它們的值。

+1

參見[如何使Perl模塊中的私有函數?(http://stackoverflow.com/questions/451521/how-do-i-make-private-functions-in-a-perl -module)。 – qqx

+0

這實際上是非常有益的,解釋了爲什麼我總是看到'在一些地方_'使用的,而不是別人+1 – dgBP

+1

另一件事學習Perl中的「新東西」是壞的:http://shadow.cat/blog/matt- s-trout /間接但還是致命的/還有很多其他好文章 –

回答

5

有沒有這樣的事情在Perl對象內部/私有方法。通常的做法是啓動任何不應公開使用下劃線的方法,但這不是以任何方式實施的。還要看看駝鹿 - 它需要很多OO perl的麻煩。

至於你的問題顯示瞭如何在一個模塊的方法可以調用另一個模塊的方法,具有訪問這兩個對象數據。我再次強烈建議你使用Moose!

sub publicSub{ 
    my ($self) = @_; 

    return $self->_privateSub(); 
} 

sub _privateSub{ 
    my ($self) = @_; 

    return $self->{name}; 
} 
+0

哦有趣 - 我嘗試通過'$ self',它似乎沒有做任何事情。我會和那玩,謝謝 – dgBP

+3

'$ self'總是持有祝福的對象本身。如果你在像'$ obj-> do($ stuff)'這樣的對象上調用方法,那麼''>''讓Perl使用'$ obj'作爲'do'子句的第一個參數,因此它需要'my $ self,$ stuff)= @ _'。你可以用內部方法來做同樣的事情。請注意,您可以**也可以使用'do($ obj,$ stuff)'顯式調用一個方法。這有效,但看起來很醜,沒有人會明白你在做什麼,所以**不要這樣做**。 – simbabque

+0

駝鹿+1。另外看[Moo](http://p3rl.org/Moo),它更輕。 – simbabque

5

我想你想的類變量。它們對於一個類是全局的,並且該類的所有實例(即,所創建的所有對象)都可以看到它們。在這種情況下,全局意味着它們處於最外層的詞彙範圍,因此所有潛艇都可以看到它們。

package ProgramTest; 
my $everyone_can_see_this = 1; # lexical scope, but 'global' to the package 

sub new { 
    my $class = shift; 
    my ($self) = { 
     name => undef 
    }; 
    bless($self, $class); 
    return $self; 
} 
sub get_var { 
    my $self = shift; 
    return ++$everyone_can_see_this; 
} 

package Main; 
my $o1 = ProgramTest->new; 
my $o2 = ProgramTest->new; 

say $o1->get_var; 
say $o2->get_var; 
say $o1->get_var; 

__END__ 
2 
3 
4 

但我不明白你爲什麼要這樣做。它沒有任何意義(除非你想要一個對象計數器)。不要將它用於配置值,或者您不能爲了同一個類的不同目的而擁有對象。

也許你想別的東西。如果是這樣,請嘗試重新提出您的問題。

+0

嗯,我之前有類變量,但被告知我應該製作一個對象並引用它。我知道我可以將它們重新放回到變量中,但似乎毫無意義地使用了一個對象。我在後面的模塊中將這些變量作爲if語句的一部分,並將它們用作另一個模塊方法的參數,所以使用一個對象似乎過於複雜。感謝您的回覆:) – dgBP