給定一個代表數字矩陣的字串,回傳該矩陣的列與欄。
例如,給定一個內嵌換行的字串:
9 8 7
5 3 2
6 6 7
代表這個矩陣:
1 2 3
|---------
1 | 9 8 7
2 | 5 3 2
3 | 6 6 7
你的程式應該要能輸出:
我們範例矩陣的各列:
以及它的各欄:
這是第一個解答不是「main」指令碼的練習。 目標是寫一個函式庫,可以納入其他 awk 程式裡使用。 這個練習裡有幾個有趣的新概念可以看看喔。
以下標示「(gawk)」的章節,都是 GNU awk 專屬的擴充功能。
這個練習中,你要從檔案讀取資料,而不是從主要輸入資料流讀取。
請閱讀 Gnu awk 手冊中關於getline的說明,特別是Getline/File和Getline/Variable/File這兩種形式。
二維陣列可能是實作這個解答的一種方式。 GNU awk 有兩種表示方式:
請注意測試檔案裡的@include指示詞。
這會指示 gawk 讀取並求值指定的檔案。
awk 的所有變數都是全域的(函式參數除外,它們是函式內的區域變數)。
這很容易發生名稱衝突,尤其當引入第三方函式庫時。
命名空間 是一種劃分變數存放位置的方式。
請注意練習檔案裡的@namespace指示詞。
預設的命名空間名稱是「awk」。 有了預設命名空間,程式設計師就能在不同命名空間的函式裡呼叫 awk 的內建函式。
陣列參數是以傳參考方式傳遞的。 在函式中對陣列所做的變更,在呼叫端也看得到。
非陣列參數則是以傳值方式傳遞。
至於_未定型別_的參數,取決於函式怎麼使用它們:
完整細節請見手冊的以值或參考傳遞函式引數。
利用「傳值」參數,可以建立函式範圍(區域)的變數。 傳給函式的值少於列出的參數數量,並不算錯誤; 多出來的參數在被使用之前都是「未定型別」的。 它們可以在函式中被指定純量值,而這些值不會存進全域命名空間。
依照慣例,函式簽章中會先列出預期的參數,接著是一些空白,然後才是區域參數。 例如:
function add(a, b, total) {
# here, `typeof(total)` is "untyped"
total = a + b
# now, `typeof(total)` is "number"
return total
}
BEGIN {
sum = add(5, 10)
print sum # 15
print typeof(total) # untyped, meaning "total" is unused in this scope
}