Awk
檢測可選函式參數(數組)
考慮這個函式:
function add_one(in_ar, each) { for (each in in_ar) { in_ar[each]++ } }
我想對其進行修改,以便如果提供了第二個數組,則將使用它而不是修改輸入數組。我試過這個:
function add_one(in_ar, out_ar, each) { if (out_ar) { for (each in in_ar) { out_ar[each] = in_ar[each] + 1 } } else { for (each in in_ar) { in_ar[each]++ } } } BEGIN { split("1 2 3 4 5", q) add_one(q, z) print z[3] }
但我得到了這個結果:
fatal: attempt to use scalar `z' as an array
您的腳本中有 2 個問題
- 變數
z
未初始化- 第二個程式碼片段中的測試
if(out_ar)
不適合數組要解決第一個問題,您需要分配一個數組元素(如
z[1]=1
),因為 awk 中沒有數組聲明。(您不能像declare -A
在 bash 中那樣使用類似的語句)。第二個問題可以解決,前提是您使用的是 GNU awk,帶有函式
isarray()
或typeof()
.所以你的程式碼應該是這樣的:
function add_one(in_ar, out_ar, each) { if (isarray(out_ar)) { for (each in in_ar) { out_ar[each] = in_ar[each] + 1 } } else { for (each in in_ar) { in_ar[each]++ } } } BEGIN { split("1 2 3 4 5", q) z[1]=1 add_one(q, z) print z[3] }