一、參數中的數組和雜湊變數:
在定義參數列表的時候,有兩種方法可以定義數組或雜湊變數為輸入參數:
1、在數組或雜湊變數形參類型名前面加上反斜線“/”;
2、把數組或雜湊變數形參類型名放在參數列表中最後面的位置上;
作為參數傳遞的數組或雜湊變數都將會被複製到參數列表的標量變數列表中,產生個數不確定的參數列表;實際上標量變數和加反斜線“ /”的數組或雜湊變數都是最常用的形參類型,因為雜湊變數或數群組類型指示符可以包含剩餘的所有參數;
在程式編譯時間,輸入到內建數組@_中的值是引用變數,所以說,@_數組實際上是一個引用數組;Perl5中把每個標量變數的引用複製到數組@_中,如果使用數組單元(如:$_[0])來修改數組@_中的內容,則修改的是傳入到參數表中的實際變數本身,而不是變數的備份;
這種傳遞參數的方式稱為按引用調用(傳地址),參數表引用記憶體中的實際變數;還有一種與按引用調用相對的調用方式叫按數值調用,這種調用方式通過把實際參數的值複製到詞法變數表中來實現的,然後再操作詞法變數表中的參數,此時修改的是備份的參數,不必擔心會修改到實際參數;按數值調用,就是做一個參數的Copy,對於大資料對象不合適;
直接修改輸入的實際參數並不完美,所以最好不要使用這種方式;要想通過修改@_數組單元的內容來修改實際參數的值,就必須要讓子程式瞭解輸入參數的情況;需要注意的是,直接修改輸入參數的值時,調用代碼必須使用子程式能夠修改的變數,如果調用中使用了直接數,而子程式又要修改實際輸入參數,那麼酒會==就會出現執行階段錯誤,導致程式崩潰;使用按引用調用時也要注意這一點;
另外,還可以使用別名來傳遞數組參數;使用&my_sub(@Array)的形式調用數組的時候,Perl會把數組@Array中的所有元素都複製到子程式的@_數組中,當數組@Array很大的時候,這種調用方式將會消耗資源和時間,效率非常低;可以使用別名傳遞數組來避免這個複製操作,以直接對記憶體中的數組操作;這種方法類似於C語言中傳遞數組的地址,但是有所不同,在定義數組的別名之後,如果有同名的簡單變數,則對該簡單變數起作用;
二、對參數列表的訪問:
Perl中有兩種方法可以訪問參數列表:
1、使用@_數組的下標來訪問每一個參數;如:$_[0]表示當前函數的第一個參數;
2、利用shift()函數和pop()函數來訪問當前函數的@_數組;
注意:子程式中的變數預設為全域變數,可以使用關鍵字my或local使其變為局部變數;
Perl中的子程式沒有類型,所有子程式都把一個列表作為參數,子程式可以在一個列表中返回,也可以在一個Scalar中返回;Perl中子程式的定義不能嵌套,它們可以在任何地方被定義,除非是在同一個塊裡面;
三、Perl提供的預定義子程式:
Perl提供了三個預定義的子程式,分別的特定的時間內執行:
◆ BEGIN:在程式啟動時被調用;
◆ END:在程式結束時被調用;
◆ AUTOLOAD:在找不到某個子程式時被調用;
程式員可以重新定義這三個子程式,以在特定的時間完成指定的操作;若同一個預定義的子程式定義了多個實現,則BEGIN順序執行,而END逆序執行;
三、子程式的傳回值:
調用子程式所產生的結果,稱為傳回值;Perl利用傳回值把值返回給主調函數;
預設情況下,Perl把子程式結束前所執行的最後一行代碼的計算結果做為傳回值返回給主調函數,調用子程式的語句中,等號左邊的變數上下文(標量上下文或列表上下文)決定了子程式傳回值的上下文;
除了預設情況之外,Perl還可以使用關鍵字return來返回子程式的傳回值;return語句可以向調用程式返回子程式的執行結果,並退出子程式的執行,即:return語句顯式地指出代碼向主調程式返回什麼樣的值,子程式在何處停止;
return語句的基本文法如下:
return (標量 / 列表);
return語句退出子程式的執行,並返回到調用程式,列表內容是返回的數值;注意:列表中所有的數組將展開成標量值;如果要返回數組或雜湊變數,最好返回數組或雜湊變數的引用;