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
の間には 1 対 1 対応があります。a
ind
2
nvalue
"two"
特別な関数呼び出し。
これはind
and argsにはnvalue
明らかに必要です。なぜなら、 2
and"two"
は名前ではないので、関数はそれを参照できないからです。
同様に重要ですが、あまり明確ではありません。名前で特定の引数に対してのみ機能する関数を持つことは非常に不便です。 argに名前を付けることは、関数が他の配列で動作できることを意味しますchangeit (b, 7, "this")
。
awkにはやや珍しい機能があります。関数は、呼び出し元が指定したものより多くのパラメーターを定義できます。関数内のこれらの値は使用のためのローカル変数であり、0またはnullに初期化されます(awkは値が割り当てられたときにのみ変数の種類を決定するため、あいまいです)。これらのargは、名前が関数専用であり、関数が占有するスペースが終了すると解放される配列でもあります。