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

関数定義の構文

関数の定義は、awkプログラムのルールとルールの間のどこででも行えます。したがって、awkプログラムの一般的な形式は広げられ、ルールおよびユーザ定義関数の定義のシーケンスを含むことになります。

nameという名前の関数の定義は、次のようになります。

function name (parameter-list) {
     body-of-function
}

キーワードfunctionfuncと短縮できます。

nameは定義する関数名です。有効な関数名は有効な変数名に似ています。つまり、文字、数字、およびアンダスコアのシーケンスです。先頭が数字であってはなりません。

parameter-listは、関数の引数とローカル変数名のリストで、カンマで区切ります。関数が呼び出されると、引数名は、呼び出しの際に与えられた引数の値の保持に使われます。ローカル変数はヌル文字列に初期化されます。

body-of-functionawk文で構成されます。この部分は、関数が実際に行うことを記述する部分なので最も重要です。引数名は、本体に引数(本体に一時的な値を保管する場所を与えるローカル変数)とのやりとりの手段を与えるために存在しています。

引数名は、構文的にはローカル変数名と区別されません。代わりに、関数が呼び出されたときに与えられた引数の数が、引数変数がいくつあるかを決定します。したがって、3つの引数の値が与えられた場合、parameter-listの最初の3つの名前は引数で、残りはローカル変数です。

ある関数の呼び出しの際、引数の数が場合によって異なる場合は、parameter-listの名前のいくつかは、ある場合は引数で、ある場合はローカル変数ということになります。また、引数が省略された場合、デフォルトでヌル文字列になるということも、その理由となります。

通常、独自の関数を書く場合には、引数に使う名前の数とローカル変数に使う名前の数は自分で知っています。慣習的に、引数とローカル変数の間にはスペースを余分に入れるべきです。そうすれば、その関数がどのように使われるようになっているのか、他の人も分かります。

関数の本体の実行中は、引数とローカル変数の値は、プログラムの残りの部分で使われている同じ名前の変数を隠蔽します。隠蔽された変数はその関数定義の中からはアクセスできません。なぜなら、それらの名前がローカル変数に使われている間は、それらを指定する方法がないからです。そのawkプログラムで使われている他の変数は、すべてその関数定義の中から、普通に参照または設定できます。

引数とローカル変数は、関数の本体が実行されている間だけ持続します。関数の本体の実行が終了すると、隠蔽された変数はもとに戻ります。

関数の本体には、関数を呼び出す式を含めることができます。関数がこの関数を、直接または他の関数を通じて呼び出すこともできます。このような場合、この関数は再帰的であるといいます。

awkでは、関数の定義を、その関数を使っている部分より前に置く必要はありません。これは、awkは関数の実行を開始する前に、プログラム全体を読み込むからです。


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