Awk

檢測可選函式參數(數組)

  • June 26, 2018

考慮這個函式:

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]
}

我建議看看這個頁面這個頁面

引用自:https://unix.stackexchange.com/questions/451896