2014-01-17 61 views
2

我的目標是使用相同的代碼來維護單獨的變量堆棧。真正的子需要多次調用,每個實例都有自己的數組。我在一個面向對象的解決方案已失敗:Perl包實例可以維護不同的變量值嗎?

package pkg_magic; 
sub new{my $pkg={}; bless $pkg; return $pkg;} 

my $keep; 
sub set{my $self=shift; $keep=shift;} 
sub show{my $self=shift; print"$self $keep\r\n";} 
1; 

從叫了兩聲:

#!/usr/bin/perl 
use strict; 
use warnings; 

push(@INC,"."); 
use pkg_magic; 

my $inst1=pkg_magic->new; 
    $inst1->set("inst1"); 
    $inst1->show(); 
my $inst2=pkg_magic->new; 
    $inst2->set("inst2"); 
# call first instance, not second 
    $inst1->show(); 
exit; 

給出的輸出:

pkg_magic=HASH(0x2020f88) inst1 
pkg_magic=HASH(0x2020f88) inst2 

顯然正在達到相同的子,即使它被稱爲不同的對象。如果我將包代碼複製到單獨的文件中並重命名這些子集(set1,set2等),所有工作都如所願,所以我只是試圖簡化代碼維護。我是否錯過了上面的東西,或者走錯了方向?

+0

Perl的類是比在其他語言中類不同。你應該閱讀[perlootut](http://perldoc.perl.org/perlootut.html)以開始。如果你想了解更多細節,你應該閱讀[perlobj](http://perldoc.perl.org/perlobj.html)。有分佈試圖隱藏你的細節;像[Moose](http://p3rl.org/Moose),[Mouse](http://p3rl.org/Mouse),[Moo](http://p3rl.org/Moo)等等。 –

回答

3

一個包級變量只能有一個單一的(全球)值,但如果你將其移動到該實例hashref,那麼每個實例都可以有自己的價值:

package pkg_magic; 
sub new{my $pkg={}; bless $pkg; return $pkg;} 

sub set{my $self=shift; $self->{keep}=shift;} 
sub show{my $self=shift; print"$self $self->{keep}\r\n";} 
1; 
+0

感謝您幫助我理解範圍問題。真正的sub有一堆數組和散列,一旦我開始「$ self - >」所有事情,它就變成了一團糟。最終,我決定將subs作爲單獨的進程產生,並通過套接字傳遞數據。我感謝你的意見。 – dougbunger

3

您必須設置對象屬性之內的對象哈希,以便它們可以獨立。

堅持傳統的編碼標準,尤其是在尋求幫助時,也更好,因此大多數人都可以輕鬆讀取您的代碼。每行多個語句是壞主意

也不需要將.推入@INC:默認情況下它已經存在。

pkg_magic.pm

package pkg_magic; 
use strict; 
use warnings; 

sub new { 
    my $self = {}; 
    bless $self; 
} 

sub set { 
    my $self = shift; 
    $self->{keep} = shift; 
} 

sub show{ 
    my $self = shift; 
    print $self->{keep}, "\n"; 
} 

1; 

prog.pl

use strict; 
use warnings; 

my $inst1 = pkg_magic->new; 
$inst1->set("inst1"); 
$inst1->show(); 

my $inst2 = pkg_magic->new; 
$inst2->set("inst2"); 
$inst1->show(); # call first instance, not second 

輸出

inst1 
inst1 
+0

你是對的,我不需要推(@INC,「。」)。那是我解決問題的盲目嘗試的殘餘。感謝您的意見。 – dougbunger

相關問題