检测可选函数参数(数组)

检测可选函数参数(数组)

考虑这个函数:

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

答案1

您的脚本中有 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]
}

我建议看看这一页这一页

相关内容