awk 中除了函式的引數列表(argument list)上的引數(arguments)外,所有變數不管於何處出現,全被視為全域性變數。其生命持續至程式結束——該變數不論在function外或 function內皆可使用,只要變數名稱相同所使用的就是同乙個變數,直到程式結束。因遞迴函式內部的變數,會因它呼叫子函式(本身)而重複使用,故編寫該類函式時應特別留心。
例如:執行
awk結果螢幕列印出'begin
function
test_variable( arg1 )
'
由上可知:
此特性優劣參半,最大的壞處是程式中的變數不易被保護,特別是遞迴呼叫本身,執行子函式時會破壞父函式內的變數。
乙個變通的方法是:在函式的引數列中虛列一些引數。函式執行中使用這些虛列的引數來記錄不想被破壞的資料,如此執行子函式時就不會破壞到這些資料。此外awk 並不會檢查呼叫函式時所傳遞的引數個數是否一致。
例如:定義遞迴函式如下:
function可將上列函式中的 i 虛列在該函式的引數列上,如此 i 便是乙個區域性變數,不會因執行子函式而被破壞。demo( arg1 )
..........
}
將上列函式修改如下:
function$0, $1,.., nf, nr,..也都是 global variable,讀者於遞迴函式中若有使用這些內建變數,也應另外設立一些區域性變數來儲存,以免被破壞。demo( arg1, i )
}
範例:以下是乙個常見的遞迴呼叫範例。它要求使用者輸入一串元素(各元素間用空白隔開) 然後列印出這些元素所有可能的排列。
編輯如下的awk程式,取名為 permu
awk執行'begin
function
permutation( main_lst, buffer, new_main_lst, nf, i, j )
# general case : 每次從 main_lst 中取出乙個元素放到buffer中
# 再用 main_lst 中剩下的元素 (new_main_lst) 往下進行排列
else
for( i=1; i<=nf ;i++)
}'$*
$ ./permu螢幕上出現提示資訊,若輸入 1 2 3 回車,結果列印出:
說明:
1. 有些較舊版的awk,並不容許使用者指定$0的值。此時可改用gawk 或 nawk。否則也可自行使用 split() 函式來分割 main_lst。
2. 為避免執行子函式時破壞 new_main_lst, nf, i, j 故把這些變數也列於引數列上。如此,new_main_lst, nf, i, j 將被當成區域性變數,而不會受到子函式中同名的變數影響。讀者宣告函式時,引數列上不妨將這些 "虛列的引數" 與真正用於傳遞資訊的引數間以較長的空白隔開,以便於區別。
3. awk 中欲將字串concatenation(連線)時,直接將兩字串並置即可(implicit operator)。
例如:
awk結果將印出'begin
'
4. awk使用者所編寫的函式可再重用,並不需要每個awk式中都重新編寫。
將函式部分單獨編寫於一檔案中,當需要用到該函式時再以下列方式include進來。
$ awk -f 函式檔名 -f awk主程式檔名 資料檔案檔名
譯 ChipMunk 教程1 設定
在我們開始實際的應用之前,這有很專案需要設定的步驟,之後我們才能專注於chipmunk。開啟xcode,然後建立乙個新的工程,使用 view based 應用程式模板,這會建立乙個簡單的應用程式,啟動應用之後,有個view會被顯示出來。在匯入這些檔案之前,我建議你建立乙個新的group,在other...
譯 ChipMunk 教程1 設定
在我們開始實際的應用之前,這有很專案需要設定的步驟,之後我們才能專注於chipmunk。開啟xcode,然後建立乙個新的工程,使用 view based 應用程式模板,這會建立乙個簡單的應用程式,啟動應用之後,有個view會被顯示出來。在匯入這些檔案之前,我建議你建立乙個新的group,在other...
譯 ChipMunk 教程1 設定
在我們開始實際的應用之前,這有很專案需要設定的步驟,之後我們才能專注於chipmunk。開啟xcode,然後建立乙個新的工程,使用 view based 應用程式模板,這會建立乙個簡單的應用程式,啟動應用之後,有個view會被顯示出來。在匯入這些檔案之前,我建議你建立乙個新的group,在other...