awk 函数中的数组参数

awk 函数中的数组参数

我在 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 函数(以及大多数其他语言中)的参数是位置性的。因此arrayaind2nvalue和之间存在一一对应关系"two"特别的函数调用。

这对于indnvalueargs 显然是必要的,因为2"two"不是名称,所以函数不能引用它们。

同样重要,但不是那么明显:拥有一个只能按名称对特定参数进行操作的函数将非常不方便。为 arg 指定名称意味着该函数可以在不同的数组上运行:changeit (b, 7, "this")

awk 有一个有点不寻常的功能。该函数可以定义比调用者指定的参数更多的参数。函数内的这些值是供其使用的局部变量,并被初始化为 0 或 null(歧义是因为 awk 仅在为变量赋值时才决定变量的类型)。这样的 arg 也可以是一个数组,其名称是函数私有的,并且它占用的空间在退出时释放。

相关内容