2017-02-16 60 views
-1

我正在學習perl並查看一些OOP的舊代碼。 在pl中,有一行在pm文件中調用該函數。 像

my $id = new ABC::Data::InstallData(); 
my $startMenu = $id->getData('menu'); 

在PM文件,該功能是象下面這樣:

package ABC::Data::InstallData; 

$debug = 1; 
sub getData {        
    my($self, $tag) = @_;     
    #print "----1------$self-----------\n"; 
    #print "----2------$tag-----------\n"; 

    if ($debug && ! defined $self->{$tag}) { 
     $logger->debug("Undefined variable $tag = $self->{$tag}");  
    } 

    if ($debug) { 
     $logger->debug("Exiting ABC::Data::InstallData::getData");  
    } 
    return $self->{$tag};            
} 

正如你所看到的,有2個打印,能夠輸出類名和inputed參數。 但我不明白$self->{$tag}的含義,有人可以幫助嗎?

+0

什麼部分你不明白? '$ self'是對象,而對應於'$ tag'的鍵是對象的屬性。 –

回答

0
$self->{tag} 

...在這種情況下是類屬性。這似乎是一個類中的setter/getter方法。下面是這個動作(詳細)一個例子:

sub new { 
    my ($class, $arg) = @_; 
    my $self = bless {}, $class; 
    $self->arg($arg); 
    return $self; 
} 
sub arg { 
    my ($self, $arg) = @_; 
    if (defined $arg){ 
     $self->{arg} = $arg; 
    } 
    return $self->{arg}; 
} 

然後,當我使用該模塊:

my $object = Blah->new(2); 
print $object->arg; 

# you can even access object attributes outside of the 
# documented accessor methods, but it breaks encapsulation, 
# so you just don't do it 

print $object->{arg}; 

輸出:

2 

在本質上,子程序getData()返回值​​,其中$self是該類的一個對象(並且是散列引用),並且tag是該對象的一個​​屬性(塞入到祝福ed散列參考$self(該對象))。當你用一個參數調用它時,​​被設置,然後返回,並在沒有參數的情況下被調用,沒有設置屬性,並返回前一個(當前)值。