講座「文系のためのawkプログラミング入門」
今回のテーマは、awkのユーザー定義関数です。第6回、第8回、第9回の講座で見たように、awkは独自の組込み関数(function)を持っています。関数というのはあるデータを与えると、それに一定の加工を施して返してくれる装置です。図で示せば下のようになります。
awkは、上の組み込み関数の他に、プログラマが独自に関数を定義し、スクリプトの中で使えるような仕組みを持っています。スクリプトの中で、繰返し同じような処理が必要な場合には、それを関数にして、呼び出せば、スクリプトを簡潔なものにすることができます。またよく使う処理の手順を関数にして、一つのファイルに記述しておけば、いろんなスクリプトでその関数を呼び出して使用することが出来ます。
まず簡単に組込み関数を復習して、その次にユーザ定義関数について見ていきます。
例えば、length() という組込み関数は文字列を与えると、その文字列の長さを返します。sqrt()関数は数を与えると、その平方根を返します。
# ex18-1 BEGIN{ x = length("apple") print "x = " x y = sqrt(9) print "y = " y }
上のスクリプトをおーくの友だちで、Input: null Output: screen で実行すると、
x = 5 y = 3
という出力が得られます。
第6回の講座で既に書いたように、関数は関数名(上の例ではlength、sqrt、rand など)の後に()をつけて、その中に処理したい数値なり、変数なりを入れます。この()の中に記述される数値や変数を引数といいます。関数によっては、複数の引数を取るものがあります。関数は引数を処理して、その結果を返してくれます。これを返値(関数が返してくれる値) と呼びます。また関数の中には、引数を取らないものもあります。rand()はそのような関数の一つで、この関数は呼び出されるたびに乱数を発生します。
ここではまず簡単な例を挙げて、関数を定義する方法について説明しましょう。まず二つの数の合計を返す関数です。
#ex18-2 (Input: null Output: screen で実行) BEGIN{ x = add(4,6) print x } function add(a,b){ return a + b }
上のスクリプトで、function というキーワードで始まる部分が関数の定義です。function といキーワードの後に、関数名と()で囲まれた引数の並びを記述します。引数はなくてもかまいません。このとき、関数名と()の間に空白を入れないように注意してください。引数はコンマで区切ります。return というキーワードの後ろにその関数の返値を記述します。return 文は関数の定義の終りに記述します。return文が実行されるとその後にプログラムが続いていても、その部分は実行されません。返値を必要としない場合、return の後ろの返値は省略できますし、return文がなくてもかまいません。
例えば上の関数を書き換えて次のようにします。
#ex18-2-1 (Input: null Output: screen で実行) BEGIN{ x = add(4,6) print x } function add(a,b){ print "関数の中です1" return a + b print "関数の中です2" }
上のスクリプトを実行すると、return 文の後のprint文は無視されるのがわかるでしょう。
次は二つの数の内、大きい数を返す関数の例です。BEGIN部では下のように直接、関数の返値を print文の後に書くこともできます。
# ex18-3 (Input: null Output: screen で実行) BEGIN{ print whichIsLarger(6,9) print whichIsLarger(12,8) } function whichIsLarger(a,b){ if(a >= b) return a else return b }
実行結果は次のようになります。
9 12
関数定義を記述する場所は任意です。下のように、スクリプトの冒頭に書いても良いし、END部のあとに書くこともできます。
# ex18-3-1 (Input: null Output: screen で実行) function whichIsLarger(a,b){ if(a >= b) return a else return b } BEGIN{ print whichIsLarger(6,9) print whichIsLarger(12,8) }
ここでawkの ユーザ定義関数についてまとめておきましょう。
1)関数の定義 function 関数名(引数の並び){ 文 文 … return 返値 } 2)関数呼び出し 関数名(引数の並び) (注) ・ 関数定義は、キーワード function で始まる ・ 関数定義はBEGIN部、本処理部、END部の内部以外のどこに書いても良い ・ 関数名はアルファベットかアンダーバー "_" で始まる ・ 関数名と()の間は続けて書く ・ 引数は省略可、又複数の場合は、コンマ "," で区切る ・ 関数の返値は、return文で記述する(これも省略可)。