譯 AWK教程指南 11遞迴程式

2022-09-01 15:21:32 字數 1882 閱讀 3153

awk 中除了函式的引數列表(argument list)上的引數(arguments)外,所有變數不管於何處出現,全被視為全域性變數。其生命持續至程式結束——該變數不論在function外或 function內皆可使用,只要變數名稱相同所使用的就是同乙個變數,直到程式結束。因遞迴函式內部的變數,會因它呼叫子函式(本身)而重複使用,故編寫該類函式時應特別留心。 

例如:執行

awk

'begin

function

test_variable( arg1 )

'

結果螢幕列印出

由上可知:

此特性優劣參半,最大的壞處是程式中的變數不易被保護,特別是遞迴呼叫本身,執行子函式時會破壞父函式內的變數。

乙個變通的方法是:在函式的引數列中虛列一些引數。函式執行中使用這些虛列的引數來記錄不想被破壞的資料,如此執行子函式時就不會破壞到這些資料。此外awk 並不會檢查呼叫函式時所傳遞的引數個數是否一致。

例如:定義遞迴函式如下:

function

demo( arg1 )

..........

}

可將上列函式中的 i 虛列在該函式的引數列上,如此 i 便是乙個區域性變數,不會因執行子函式而被破壞。

將上列函式修改如下:

function

demo( arg1, i )

}

$0, $1,.., nf, nr,..也都是 global variable,讀者於遞迴函式中若有使用這些內建變數,也應另外設立一些區域性變數來儲存,以免被破壞。

範例:以下是乙個常見的遞迴呼叫範例。它要求使用者輸入一串元素(各元素間用空白隔開) 然後列印出這些元素所有可能的排列。

編輯如下的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...