六、遞歸子程序
PERL中,子程序可以互相調用,其調用方法與上述相同,當調用該子程序本身時,即成了遞歸子程序。遞歸子程序有兩個條件: 1、除了不被子程序改變的變量外,所有的變量必須的局部的; 2、該子程序要含有停止調用本身的代碼。
七、用別名傳遞數組參數
1、用前面講到的調用方法&my_sub(@array)將把數組@array的數據拷貝到子程序中的變量@_中,當數組很大時,將會花費較多的資源和時間,而用別名傳遞將不做這些工作,而對該數組直接操作。形式如: @myarray = (1, 2, 3, 4, 5); &my_sub(*myarray); sub my_sub { my (*subarray) = @_; }
2、此方法類似于C語言中的傳遞數組的起始地址指針,但并不一樣,在定義數組的別名之后,如果有同名的簡單變量,則對該變量也是起作用的。如: $foo = 26; @foo = ("here's", "a", "list"); &testsub (*foo); ... sub testsub { local (*printarray) = @_; ... $printarray = 61; } 當子程序執行完,主程序中的$foo的值已經成了61,而不再是26了。
3、用別名的方法可以傳遞多個數組,如: @array1 = (1, 2, 3); @array2 = (4, 5, 6); &two_array_sub (*array1, *array2); sub two_array_sub { my (*subarray1, *subarray2) = @_; } 在該子程序中,subarray1是array1的別名,subarray2是array2的別名。
八、預定義的子程序
PERL5預定義了三個子程序,分別在特定的時間執行,它們是:BEGIN子程序在程序啟動時被調用;END子程序在程序結束時被調用;AUTOLOAD子程序在找不到某個子程序時被調用。你可以自己定義它們,以在特定時間執行所需要的動作。如: BEGIN { print("Hi! Welcome to Perl!n"); } AUTOLOAD{ print("subroutine $AUTOLOAD not foundn"); # 變量$AUTOLOAD即未找到的子程序名 print("arguments passed: @_n"); } 若同一個預定義子程序定義了多個,則BEGIN順序執行,END逆序執行。
|