Perl基礎 Perl復雜數據結構
本文和大家重點討論一下 Perl復雜數據結構的概念。Perl能使復雜的事情變得簡單,方法是讓你假裝那些復雜的數值實際上是簡單的東西.換句話說,Perl讓你可以操作簡單的標量,而這些標量碰巧是指向復雜數組和散列的引用.
Perl復雜數據結構
數組和散列是易用、簡單平面的數據結構,很不幸,現實總不能如人所愿。很多時候你需要使用很難、復雜而且非平面的數據結構。Perl能使復雜的事情變得簡單。方法是讓你假裝那些復雜的數值實際上是簡單的東西.換句話說,Perl讓你可以操作簡單的標量,而這些標量碰巧是指向復雜數組和散列的引用.在自然語言中,我們總是用簡單的單個名詞來表示復雜的難以理解的實體,比如,用"政府"來代表一個關系復雜的硬殼等等.
繼續討論上個例子,假設我們想討論Jacob的妻子而不是Adam的,而Jacob有四個妻子(自己可別這么干)。為了在Perl中表示這個數據結構,我們會希望能將Jocob的四個妻子當成一個來處理,但是我們會遇到一些問題。你可能認為我們可以用下面的語句來表示:
$wife{"Jacob"}=("Leah","Rachel",'Bilhah","Zilpah");#錯
但是這并不能象你希望的那樣運轉,因為在Perl中括弧和逗號還不夠強大,還不能將一個列表轉換成為標量(在語法中,圓括弧用于分組,逗號用于分隔)。你需要明確地告訴Perl你想將一個列表當成一個標量。[]中括弧能夠實現這個轉換:
$wife{"Jacob"}=["Leah","Rachel","Bilhah","Zilpah"];#正確
這個語句創建了一個未命名的數組,并將這個數組的引用放入散列的元素$wife{“Jacob”}中.因此我們有了一個命名的散列,其中包含了一個未命名的數組.這就是Perl處理多維數組和嵌套數據類型的方法.同普通數組和散列的賦值方法一樣,你可以單獨對其進行賦值:
- $wife{"Jacob"}[0]="Leah";
- $wife{"Jacob"}[1]="Rachel";
- $wife{"Jacob"}[2]="Bilhah";
- $wife{"Jacob"}[3]="Zilpah";
你可以從上邊看出,這看起來象一個具有一個字符串下標和一個數字下標的多維數組.為了更多了解樹狀結構,如嵌套數據結構,假設我們希望不僅能列出Jocob的妻子,而且同時能列出每個妻子的所生的兒子,Perl復雜數據結構在這種情況下,我們希望將散列結構也當成一個標量,我們可以使用花括弧來完成(在每個散列值中,象上個例子一樣用中括弧表示數組,現在我們有了一個在散列中的散列中的數組)。
$kids_of_wife{"Jacob"}={
"Leah"=>["Reuben","Simeon","Levi","Judah","Issachar","Zebulun"],
"Rachel"=>["Joseph","Benjamin"],
"Bilhah"=>["Dan","Naphtali"],
"Zilpah"=>["Gad","Asher"],};
同樣,我們也可以象下面這樣表示:
- $kids_of_wife{"Jacob"}{"Leah"}[0]="Reuben";
- $kids_of_wife{"Jacob"}{"Leah"}[1]="Simeon";
- $kids_of_wife{"Jacob"}{"Leah"}[2]="Levi";
- $kids_of_wife{"Jacob"}{"Leah"}[3]="Judah";
- $kids_of_wife{"Jacob"}{"Leah"}[4]="Issachar";
- $kids_of_wife{"Jacob"}{"Leah"}[5]="Zebulun";
- $kids_of_wife{"Jacob"}{"Rachel"}[0]="Joseph";
- $kids_of_wife{"Jacob"}{"Rachel"}[1]="Benjamin";
- $kids_of_wife{"Jacob"}{"Bilhah"}[0]="Dan";
- $kids_of_wife{"Jacob"}{"Bilhah"}[1]="Naphtali";
- $kids_of_wife{"Jacob"}{"Zilpah"}[0]="Gad";
- $kids_of_wife{"Jacob"}{"Zilpah"}[1]="Asher";
可以從上面看出,在嵌套數據結構中增加一層,就像在多維數組中增加了一維。在Perl內部表示是一樣的,但是你可以用任何一種方法來理解。
這里最重要的一點就是,Perl可以用簡單的標量來代表Perl復雜數據結構。Perl利用這種簡單的封裝方法構建了基于對象的結構。當我們用下面的方法調用Camel對象的構造函數的時候:
$fido=newCamel"Amelia";
我們創建了一個Camel對象,并用標量$fido來代表。但是在Camel對象里面是很復雜的。作為優秀的面向對象的程序員,我們不想關心Camel對象里面的細節(除非我們是實現Camel類方法的人)。但是一般說來,一個對象的組成中會有一個包含對象屬性的散列。例如它的名字(本例子中,是“Amelia”而不是“fido”),還有駝峰的數量(在這里我們沒有明確定義,因此使用缺省值1,和封面一樣)。
【編輯推薦】



















