Perl入門 ≫ LESSON9 サブルーチン
サブルーチンの基本
Perlではコード、つまり処理のかたまりをサブルーチンとして定義しておくことができます。
サブルーチンと関数はPerlでは同じ意味です。
例えば、複数のコマンドからなる同じ処理をプログラム中で何個所も書かなければならない時は、サブルーチンとしてその複数のコマンド群を定義して、それをプログラム中で呼び出せばいいのです。
今まで何度も出てきたprintも関数です。これは組み込み関数といって、Perlですでに定義されていて、どこでも使えるものです。他にもたくさんあるので、それは今後紹介していきます。
では、そのサブルーチンは何処に書くかと言うとファイル中どこで書いてもかまいません。
ですが、プログラムを見やすくするためには、ファイルの下か上にまとめて書きましょう。
また、同じファイルに書く必要もなくて、他のファイルで作って呼び出して使うことができます。
#サブルーチン定義
sub サブルーチン名{
処理1;
処理2;
;
}
#呼び出し
サブルーチン名();
では実際にやってみましょう。
sub1();
sub1();
#サブルーチンsub1を定義
sub sub1 {
print "sub1 exec\n";
}
結果は以下。
sub1 exec
sub1 exec
サブルーチン名は変数名と同様で自分で好きに付けられます(半角英数文字)。
引数と戻り値
サブルーチンには引数として、何か値を渡すことができます。
サブルーチンからは処理の結果として戻り値を返すことができます。
#サブルーチン定義
sub サブルーチン名{
my リスト名 = @_;
処理1;
処理2;
;
return 戻り値;
}
#呼び出し
変数 = サブルーチン名(引数1,引数2,...);
引数はリストの形式にして複数渡すことができます。
サブルーチンでは、特殊配列@_に渡された引数が入ってくるので、それをそのサブルーチンの中で使える配列変数に代入しましょう。
サブルーチンの中で処理を行い、returnで戻り値を返すことができます。
では実際にやってみましょう。
my $kekka = sub1(1,2,3);
print "$kekka";
#サブルーチンsub1を定義
sub sub1 {
my @list = @_;
my $r;
$r = $list[0] + $list[1] + $list[2];
return $r;
}
結果は以下。
6
配列の戻り値を作ることもできます。
my @kekka = sub1(2,3,4);
print "$kekka[0] : $kekka[1]";
#サブルーチンsub1を定義
sub sub1 {
my @list = @_;
my @r = ();
$r[0] = $list[0] + $list[1] + $list[2];
$r[1] = $list[0] * $list[1] * $list[2];
return @r;
}
結果は以下。
9 : 24
呼び出し方の色々
サブルーチンの呼び出し方はいろいろあります。
サブルーチン名(引数1,引数2,...);
&サブルーチン名(引数1,引数2,...);
サブルーチン名;
&サブルーチン名;
サブルーチン名();
&サブルーチン名();
サブルーチンは、サブルーチン名の前に”&”を付けても呼び出せます。
引数がない場合は、サブルーチン名だけでも空リストの”()”を付けてもどちらでもかまいません。
が!
()も&もつけない場合、サブルーチンとして認識してくれません。
では実際にやってみましょう。
my $kekka = sub1;
print "$kekka\n";
#サブルーチンsub1を定義
sub sub1 {
return 1;
}
結果はエラーになります。
しかし、定義を呼び出し元より前に書くとちゃんと認識して実行してくれます。
#サブルーチンsub1を定義
sub sub1 {
return 1;
}
my $kekka = sub1;
print "$kekka\n";
結果は以下。
1
サブルーチンに()も&もつけない場合は、呼び出し元よりも前に定義しましょう。
サブルーチンの定義場所は人の好みによります。基本的に&か()をつけて使えば、あとは個人個人でお好きなように。
printなどの組み込みと同じ名前の関数を作ったらどうなるでしょう?
sub print {
print "myprint_" . $_[0];
}
&print("test");
myprint_test
自作関数名に「&」をつける、引数は( )で渡す、この2点がそろえば自作関数は実行されます。定義場所はどこでもいいです。
が!
やはり非常にややこしいので、Perlの組み込み関数と同じ名前の関数はなるべくつけないようにしましょう。