Go to the first, previous, next, last section, table of contents.

ユーザ定義関数の呼び出し

関数を呼び出すとは、関数を実行させ、その仕事を行わせることを意味します。関数呼び出しは式で、その値はその関数によって返された値です。

関数呼び出しは、関数名とそれに続く、カッコで囲まれた引数で構成されます。引数として関数呼び出しの中に書くものは、awkの式です。それらの式は、呼び出しが実行されるたびに評価され、その値が実際の引数となります。たとえば、3つの引数でfooを呼び出すには、次のように書きます。

foo(x y, "lose", 4 * z)

注意:関数名と引数リストのカッコの間にホワイトスペース文字(スペースおよびタブ)を入れてはなりません。誤ってホワイトスペースを入れた場合は、変数とカッコで囲まれた式との連結と見なされる場合があります。しかし、変数名ではなく関数名が使われたと判断され、エラーがレポートされます。

関数が呼び出されると、関数にはその引数の値のコピーが与えられます。これを値による呼び出し(call by value)といいます。呼び出し側の関数は、変数を引数の式として使えますが、呼び出された関数には、そのことは分かりません。分かっているのは、引数がどの値を持っているかということだけです。たとえば、次のようなコードを書いた場合、

foo = "bar"
z = myfunc(foo)

myfuncの引数を"変数foo"と考えるべきではありません。文字列値"bar"と考えてください。

myfunc関数がそのローカル変数の値を変更した場合、これは他の変数には影響はありません。特に、myfunc次のようなことを行う場合、

function myfunc (win) {
  print win
  win = "zzz"
  print win
}

最初の引数変数winを変更する場合に、呼び出し側の関数のfooの値は変更しませんmyfuncを呼び出す際のfooの役割は、その値"bar"が計算されたときに終了します。また、winmyfuncの外にもある場合、関数の本体はこの外にある値を変更することはできません。なぜなら、myfuncの実行中はこの値は隠蔽されており、myfuncからは参照することも変更することもできないからです。

しかし、配列が関数のパラメータの場合は、そのパラメータはコピーされません。配列それ自体が関数によって直接操作されます。これは通常、参照による呼び出し(call by reference)といいます。関数の本体内で配列パラメータに対してなされた変更は、その関数の外から見えますこれは、行われていることを監視していないと非常に危険です。たとえば、

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]
      }

このプログラムは、`a[1] = 1、a[2] = two、a[3] = 3'を表示します。これは、changeitを呼び出すと、aの2番目の要素に"two"が格納されるからです。


Go to the first, previous, next, last section, table of contents.