考虑这个函数:
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]
}