一、引用的概念:
Perl中提供了一種類似於C/C++語言中的指標功能的資料類型,名叫引用;這個引用與C++中的引用的概念不一樣,但是效果一樣;Perl中的引用就是指標,它用於跟蹤變數在記憶體中的地址,可以跟蹤簡單的標量變數、陣列變數、雜湊變數、檔案控制代碼變數,甚至還可以跟蹤子程式;引用存放的是某個變數在記憶體中的地址,這對於跟蹤大型的資料對象是很有用的;引用也是一種資料類型,這種類型的變數叫做引用變數,引用變數中存放的是記憶體位址,而不論被引用的資料對象是何種類型的資料對象,不論被引用的資料對象所佔用的記憶體空間有多大,引用變數中存放的總是被引用的資料對象的記憶體位址;記憶體位址是個無符號的整數,所以引用型變數總是一個簡單的標量變數,與其它普通的標量變數的使用方法完全相同;
如果在程式中使用了引用,那麼,Perl解譯器不再通過變數的名字來調用變數的值,而是是通過引用變數中所存放的記憶體位址來調用變數的值;
總之,引用變數可以跟蹤變數在記憶體中的地址,它可以跟蹤任何類型的變數;引用變數總是一個標量,用於存放另一對像在記憶體中的地址,引用變數之佔用記憶體中的一個地址空間,而無論存放的是一個標量變數的地址還是存放其它大對象的記憶體位址;
二、引用的使用:
如果標量變數$Pointer中存放的是一個數組的地址,那麼,在訪問數組元素的時候,要先提取數組的地址,然後 再通過地址來訪問數組中的元素;如:可以通過形式“@$Pointer ”來訪問數組中的元素;形式“@$Pointer ”的意義為:取出$Pointer中存放的地址作為數組使用;類似地,如果$Pointer中存放的是某個雜湊變數的地址,那麼可以通過形式“%$Pointer ”來訪問雜湊變數中的元素;
三、常見資料類型的引用定義:
資料類型 定義 舉例
標量變數 /$Var $Pointer = /$Var
數組 /@Array $Pointer = /@Array
雜湊變數 /%Hash $Pointer = /%Hash
檔案控制代碼 /*FILEHANDLE $Pointer = /
常量 /常量 $Pointer = /3.1415926
子程式 /&SubRoutine $Pointer = /&SubRoutine
匿名數組 [ LIST ] $Pointer = [ “Smith”,“Jack”,“Jimmy”,“ZhaZha”]
匿名雜湊變數 { Key=>Value } $Pointer = { Key1=>Value1,Key2=>Value2}
匿名子程式 sub {} $Pointer = sub { printf( “Hello,Perl World/n”);}
對象引用 bless $self;
四、引用變數的類型:
1、粗略地分,可以分為硬引用和符號引用;符號引用中包含變數的名字,符號引用就類似與檔案名稱或作業系統的軟串連,而硬引用則類似與作業系統中的硬串連;硬引用跟蹤引用的計數,當引用計數為0時,Perl自動將被引用的項目所佔用的記憶體釋放掉;如果被引用的項目是某個類的對象,那麼Perl在釋放該對象時會自動調用該對象的析夠函數,以釋放其記憶體;Perl本身就是一個物件導向的語言,Perl中的一切都是對象,而包和模組是對象更便於使用;
2、如果按照引用變數中所存放的地址類型來分,引用變數可以分為6種類型:
★ 直接引用型變數:顧名思義,直接引用變數儲存了其它變數的地址,包括標量、陣列變數、雜湊變數、檔案控制代碼變數以及其它類型的變數;直接引用變數可以修改被引用的變數的值,引用變數中的地址值也可以被修改;直接引用變數使用反斜線“/”來定義;
對於數組和雜湊變數的直接引用可以這樣定義:
$lpArray = /@Array;#$lpArray存放了數組@Array的首地址,$lpArray代表數組名;
此時數組元素的訪問方式有:$lpArray->[$Index] 或 $$lpArray[$Index] 或 ${$lpArray}[$Index];
$lpHash = /%Hash; #$lpHash存放了雜湊變數%Hash的首地址,$lpHash代表雜湊變數的名稱;
此時雜湊變數的元素的訪問方式有:$lpHash->{$key} 或 $$lpHash{$key} 或 ${$lpHash}{$key};
★ 常量引用型變數:它引用的是直接數,而不是變數;也使用反斜線“/”定義;常量引用變數所儲存的地址值可以被修改,但是被引用的常量值是不能被修改的,因為被引用的是常量;它的儲存方式決定了它是被存放再一塊受保護的記憶體空間中的;
★ 子程式引用型變數:它是直接引用變數和常量引用變數的混合;子程式引用變數不能用來修改子程式引用變數所指向的子程式,但是子程式本身是可以被修改的;產生子程式引用型變數時,必須使用位與運算子“&”來定義所引用的是子程式而不是直接數;
★ 符號引用型變數:符號引用型變數是包含另一個變數的直接數名稱的變數;Perl中使用反斜線“/”和變數名稱來定義引用符號;
★ 匿名引用型變數:匿名引用變數可以產生不命名的對象引用,這些對象也被成為是孤立的對象;匿名引用有匿名數組、匿名雜湊變數和匿名子程式;分別使用運算子“[]”、“{}”和 "sub {}”。匿名引用運算子的使用是上下文相關的,只在給標量變數賦值的時候才產生引用。匿名子程式運算子要求在子程式定義內用分號結尾;Perl把匿名引用變數當作在記憶體位址中有特定地址的語句;
★ 對象引用變數:對象引用變數就是匿名雜湊變數引用的一個典型應用;Perl中使用bless操作符來專門處理這類引用,可以產生引用對象與產生對象的類之間的串連;
五、間接引用:
訪問引用所指向的變數的值,稱為間接引用;要取得記憶體中引用變數最終所指向的數值,就必須告訴Perl解譯器尋找作為數值容器的引用變數所儲存的記憶體位址;實際情況是這樣的,Perl中的每一個“$”符號就是一個數值容器,Perl解譯器從右至左,或從內到外來順序地解釋每一個“$”符號。每次遇到“$”符號時,都會把$右邊的對象作為一個數值容器,比如:$$Pointer,Perl就會把Pointer當作一個數值容器,從右邊第一個$開始取得對象Pointer中存放的地址,當遇到左邊的$時,又會把$Pointer當作一個數值容器,而$Pointer中存放的時地址,左邊的$表示一個數值容器,所以${$Pointer}就取到了引用變數所指對像中儲存的數值內容了;
注意:指標就是地址,通過指標可以訪問到該地址處所存放的資料;如果指標指向了無效的記憶體位址,就會得到不正確的資料,通常情況下,Perl會返回null值,但是並不依賴於此,一定要在程式中正確地初始化所有的指標,使之指向有效資料項目;
六、匿名數組和匿名雜湊變數:
匿名數組: $lpArray = [1,2,"A","B",(4 .. 10),[12 .. 20]];
匿名雜湊變數:$lpHash = {Key1=>Value1,Key2=>Value2,Key3=>Value3,....,KeyN=>ValueN};