◆ 関数

Perlには実にたくさんの組み込み(ビルトイン)関数が定義されています。例えば、print文も組み込み関数の1つです。そうした組み込み関数を利用することで、シーンに応じた様々な機能を実現することができます。

一方で、組み込み関数を使わない「自前」の関数を定義して利用することのできます。自前の関数を「ユーザ定義関数」と呼び、任意に作成します。

関数の必要性
関数を「サブルーチン」と呼ぶことがあります。何らかのプログラミングを経験した方ならその意味が理解できると思いますが、サブルーチンとは、要するに頻繁に利用する小さなプログラムを個別に作成し、必要に応じて呼び出すという手法です。
Perlのプログラムは(決して Perlだけではなく)基本的にプログラムの記述順、つまり上から下に向かって処理していきます。複雑なプログラムは、必然的に長くならざるを得ません。
また、プログラムでは同じような処理が何度も登場することが一般的で、そのたびにその処理プログラムを書くのは大変なことです。
そうした同じ処理を1つの「関数」として定義することができれば、プログラム作成の生産性は飛躍的に高まります。必要に応じてその関数を呼び出すという手法は、おそらくほとんどの開発プログラミングで利用されていることでしょう。むしろ、関数のないプログラムなんてあり得ないのです。
関数の定義
Perlにおける関数の定義方法は幾つかあります。以下はよく利用されている書式です。
 sub 関数名 {
     処理内容のプログラム;
    }
この書式で記述した sub とは、「subroutine」つまり、サブルーチンの略で、関数を定義するために使われます。
関数は定義しただけでは、何もしません。関数を利用するためには、プログラム中で関数を呼び出さなくてはなりません。関数の呼び出し方も複数ありますが、以下は代表的な関数の呼び出しのための書式です。
 &関数名();
このように、関数名の冒頭にアンパサンド「&」と、文末に括弧「()」を記述します。
ただし、アンパサンドと括弧は省略可能です。しかし、それらを省略するとプログラムを書き直す場合、直感的にそれが関数の呼び出しであると分かりにくいものです。それ故、できるだけこのように記述した方が、後々便利になることでしょう。
引数(パラメータ)
関数には「引数:ひきすう」を取ることができます。単に関数を呼び出すだけでなく、引数にパラメータを与えて呼び出すことで、関数内でそのパラメータを利用することができます。
引数は特殊配列「@_」に格納されます。配列についての詳しい説明は 変数と配列 を参照してください。
特殊配列「@_」とは、配列名が「_」であると認識してください。関数内では、@_ をそのまま参照することもできますが、いったん別の変数にセットしてから利用するのが一般的です。
 sub 関数名 {
     local(変数名) = @_;
        処理内容;
    }
上記は、関数に引数を与えるための書式を示したものです。なお、loacl とは、ローカル変数を宣言するもので、その変数はブロック内と、ブロック内から呼び出されれる関数内でのみ有効な変数を定義します。
以下は、関数の引数を使ったサンプルプログラムです。
 sub show thisYear {
     local($year) = @;
       $i = $year - 1988;
       print "$year 年は、平成 $i 年です\n";
     }

  &show thisYear(2003);
  &show thisYear(2004);
このプログラムでは、西暦から和暦(平成年)を求める関数を定義し、関数を呼び出す際に引数を指定してその答えを表示させるものです。
ここでは、引数を1つ取り、関数の先頭でスカラ変数$year へセットされます。関数を呼び出すときに引数(パラメータ)を指定していることがお分かりでしょう。
戻り値
関数では、戻り値を持たせることができます。戻り値があると関数の実行結果を、呼び出し元で変数にセットできるメリットがあります。
戻り値を持たせる書式は以下のように、return文を、関数の最後に記述します。
 sub 関数名 {
     処理内容のプログラム;

     return(戻り値);
    }
return文の指定がない場合には、その関数内で最後の実行された結果が返されます。そのため、上記のように return文を記述した場合と同じ結果になる場合があります。
しかし、戻り値の記述を省略した場合、プログラム中でどれが戻り値なのか直感的に分かりにくいため、戻り値が必要な場合には、できるだけ戻り値を示す return文を記述するようにお勧めします。
以下は、戻り値を求めるための具体的な書式です。
 sub show thisYear {
     local($year) = @;
       $i = $year - 1988;
       return($i);
     }

  $modori = &show thisYear(2003);
  print "2003年は、平成 $modori 年です\n";


This Page is HTML4.01 Valid! 最新更新日 2003/11/2
Copyright(C) 2002-2003 banban@scollabo.com