我在 awk 中有以下示例,由函数和主体组成。我正在努力了解数组在函数内部的实际工作方式。因为虽然array
是在函数中定义changeit
并设置为某个值,但在脚本主体中使用的是名称a
。
我的印象是数组是全局的,并且在主体和函数内必须使用相同的名称。
尽管数组本身可供函数直接操作,但为什么主体使用不同的名称a
而不是array
?
function changeit(array, ind, nvalue)
{
array[ind] = nvalue
}
BEGIN {
a[1] = 1; a[2] = 2; a[3] = 3
changeit(a, 2, "two")
printf "a[1] = %s, a[2] = %s, a[3] = %s\n",
a[1], a[2], a[3]
}
答案1
awk 函数(以及大多数其他语言中)的参数是位置性的。因此array
和a
、ind
和2
、nvalue
和之间存在一一对应关系"two"
特别的函数调用。
这对于ind
和nvalue
args 显然是必要的,因为2
和"two"
不是名称,所以函数不能引用它们。
同样重要,但不是那么明显:拥有一个只能按名称对特定参数进行操作的函数将非常不方便。为 arg 指定名称意味着该函数可以在不同的数组上运行:changeit (b, 7, "this")
。
awk 有一个有点不寻常的功能。该函数可以定义比调用者指定的参数更多的参数。函数内的这些值是供其使用的局部变量,并被初始化为 0 或 null(歧义是因为 awk 仅在为变量赋值时才决定变量的类型)。这样的 arg 也可以是一个数组,其名称是函数私有的,并且它占用的空间在退出时释放。