2011-11-23 138 views
0

tutorial中,有一個Person類的代碼。你能向我解釋第21/27行的目的嗎?我理解像$ _和@_這樣的概念,並且我知道my用於聲明本地引用,但我不瞭解這些代碼上下文中的那些行。在Perl函數中聲明變量

1 #!/usr/bin/perl 
2 
3 package Person; 
4 
5 sub new 
6 { 
7  my $class = shift; 
8  my $self = { 
9   _firstName => shift, 
10  _lastName => shift, 
11  _ssn  => shift, 
12 }; 
13 # Print all the values just for clarification. 
14 print "First Name is $self->{_firstName}\n"; 
15 print "Last Name is $self->{_lastName}\n"; 
16 print "SSN is $self->{_ssn}\n"; 
17 bless $self, $class; 
18 return $self; 
19 } 
20 sub setFirstName { 
21 my ($self, $firstName) = @_; 
22 $self->{_firstName} = $firstName if defined($firstName); 
23 return $self->{_firstName}; 
24 } 
25 
26 sub getFirstName { 
27 my($self) = @_; 
28 return $self->{_firstName}; 
29 } 
30 1; 
+0

如果您有興趣做OO Perl中,我會強烈建議考慮看看[穆斯(https://metacpan.org/module/Moose),這使得很多是重複的樣板消失。有一個很好的介紹駝鹿在(免費)的書[現代的Perl](http://onyxneon.com/books/modern_perl/) – friedo

+0

[perlootut](http://search.cpan.org/perldoc?perlootut)是官方文檔中的現代Perl OO教程。 – daxim

回答

3
20 sub setFirstName { 
21 my ($self, $firstName) = @_; 

在最基本的層面上,這條線取前兩個參數的子程序,並將它們分配給本地變量$self$firstName

$person->setFirstName('jeeves'); 

在面向對象的Perl中,傳遞給該方法(因爲這是在子程序已經成爲)的第一個參數的情況下是在其上調用該方法的實例的引用($person是上述例)。您需要該參考來獲取其他方法和實例狀態。通常將其稱爲$self。在其他語言中,會有類似this的內置語言,因此您不必手動提取它。

之後,第一個特殊參數是該方法的其他(「正常」)參數。

1

這是一個標準的setter,它爲person對象設置_firstName變量。現在,通過行會行

my ($self, $firstName) = @_; 

這是分配前兩個參數與該setFirstName被調用$自我和$的firstName分別是相同

$self = $_[0]; $firstName = $_[1]; 

下一頁

$self->{_firstName} = $firstName if defined($firstName); 

這是將$ self person對象的_firstName變量賦值給前一行定義的$ firstName,並且僅在定義了$ firstName時才這樣做

$self->{_firstName} = $firstName if defined($firstName); 

返回自對象的新_FirstName,也未必可以改變

1

由於您瞭解@_的概念,您會意識到只要您需要它們,您就可以使用shift$_[0]訪問這些概念。擁有這些產品線的原因更多的是最佳做法。由於Perl沒有形式參數,我們通常在做任何事情之前將它們分配給子例程開始處的命名變量。通過這種方式,代碼清楚地顯示了子例程的期望以及每個參數的含義。 (之所以選擇不這樣做,是因爲代碼效率,但通常您應該首先選擇代碼清晰度。)

請注意變量周圍的括號。這是將@_數組分配給包含($self, $firstname)的列表。如果你沒有括號,它不會工作,因爲它試圖將一個數組分配給多個標量。請注意,如果@_包含更多參數,它們將被忽略。

該列表聲明使用my。這意味着這些標量將只存在於這個子程序中。這是爲了安全起見,如果您在其他地方使用同名的標量,則不會發生意外結果的衝突。請注意,您需要有use strict線在你的文件的頂部my予以強制執行。

$self用於面向對象的Perl。它將始終是方法的第一個參數。因此,在像$obj->firstname($foo)通話,$obj將被分配到$self你的方法裏面,$foo將被分配到$firstname