※ここの解説は、後になるほど省略されている場合がありますのでできるだけ順番に読んでください。
■ 13.サブルーチンと#
どうですか、CGIの機能追加をしていくと段々とプログラムが見づらくなってきましたね。
そこで、今回のサブルーチンの登場となるのです。
サブルーチンとは、ある一連の作業をグループ化して独立させたものを言います。
もちろん、別ファイルから読み込んでくることもありますが、今回は、同一CGI内に記述するサブルーチンを説明します。
■ サブルーチンの記述
サブルーチンの呼び出し方(実行)は次のように記述します。
記述例 | 意 味 |
---|---|
&サブルーチン名; サブルーチン名(); | 引数のない呼び出し 引数..パラメータのこと |
&サブルーチン名(引数のリスト); サブルーチン名(引数のリスト); | 引数を持った呼び出し |
変数 = &サブルーチン名; 変数 = サブルーチン名(); 変数 = &サブルーチン名(引数のリスト); 変数 = サブルーチン名(引数のリスト); | 戻り値を持ったサブルーチンの呼び出し |
引数とは、サブルーチンに渡したい変数のことをいいます。
複数の引数を渡す場合は、,(カンマ)で区切ります。
呼び出されるサブルーチンは次のようにして記述します。
- 【記述サンプル】
- sub サブルーチン名 { my 変数 = @_; 実行文のブロック return 変数; }
サブルーチン内で引数を受け取る時は、「@_」 変数を使用します。
my 変数 は、そのサブルーチンでしか使用しない変数を定義するときに使用します。
my 変数 で指定された変数は、サブルーチンの外では無効です。
サブルーチン外で指定された変数はそのまま使用できます。
return文は、そのサブルーチンから値を返したい場合に使用します。
通常、サブルーチン内の実行文は、呼び出されない限り実行されません。
サブルーチンの使用サンプルをいくつか紹介します。
記述例 | 実行結果 |
---|---|
&sub1; sub sub1{ print "sub1 exec!"; } | sub1 exec! |
print "---"; sub1(); print "---"; sub sub1{ print "sub1 exec!"; } | --- sub1 exec! --- |
sub1("sub1","exec!"); sub sub1{ @param = @_; print $param[0]; print " "; print $param[1]; } | sub1 exec! |
$a = "sub1"; sub1("exec!"); sub sub1{ @param = @_; print $a; print " "; print $param[0]; } | sub1 exec! |
$a = "sub1"; sub1("exec!"); print "<BR>"; print $a," ",$b; sub sub1{ $b = @_; print $a," ",$b; } | sub1 exec! sub1 exec! |
$a = "sub1"; sub1("exec!"); print "<BR>"; print $a," ",$b; sub sub1{ my $b = @_; print $a," ",$b; } | sub1 exec! sub1 |
$a = "sub1"; sub1("exec!"); print "<BR>"; sub2(); sub sub1{ $b = @_; print $a," ",$b; } sub sub2{ print $a," ",$b; } | sub1 exec! sub1 exec! |
$a = "sub1"; sub1("exec!"); print "<BR>"; $d = sub2("exec!"); print $a,"/",$b; print "<BR>"; print $c,"/",$d; sub sub1{ my $b = @_; print $a," ",$b; } sub sub2{ my $c = @_; print $a," ",$b; return $c; } | sub1 exec! sub1 sub1/ /exec! |
サブルーチンの使用方法がわかった所で前回のサンプルをサブルーチン化してみましょう。
■ サブルーチン化
前回のサンプルで変更したい箇所は、HTMLの記述をしている部分です。
その部分をまず、サブルーチンにします。
記述例は、次のようになります。
- 【記述サンプル】
- sub not_dsp { print << "END_OF_DOC"; Content-type:text/html\n\n <HTML> <HEAD> <title>ファイル表\示の中止</title> </HEAD> <BODY TEXT="purple" BGCOLOR="#99ff99"> <B>ごめんなさい、testhtm.dat以外は表\示できないの。</B> </BODY> </HTML> END_OF_DOC }
そして、それを呼び出す記述は次のようになります。
¬_dsp;
さらに、読みやすくするためにコメントを入れましょう。
■ #(コメントマーク)
Perlでコメント(注釈)を記述したい場合は、「#」を使用します。
「#」以降が全てコメントになります。
使用サンプルをいくつか紹介します。
- 【記述サンプル】
- #このようにコメントが記述できます。 print; #命令の後ろに記述しても構いません for ($i=0;$i<5;$i++) { #for文の中に記述しても構いません }
したがって、前回のサンプルをサブルーチン化し、適度にコメントを入れてみました。
- 【記述サンプル】
- #!/usr/bin/perl $param = @ARGV[0]; #パラメータの取得 if ($param ne "testhtm.dat") { #testhtm.dat以外は、メッセージを表示して #強制終了する ¬_dsp; exit(0); } #---HTMLファイルの確認--- if ( (substr($param,-4) eq ".htm") or (substr($param,-5) eq ".html") ) { print "Content-type:text/html\n\n"; } else { print "Content-type:text/plain\n\n"; } #---ファイル表示の開始--- open(FILE, "<$param"); while(<FILE>){ #whileループの開始 print; #---if文の開始--- if ( not( (substr($param,-4) eq ".htm") or (substr($param,-5) eq ".html") ) ) { print "<BR>"; } #---if文の終了--- } #whileループの終了 close(FILE); #---ファイル表示の終了--- #===サブルーチンの記述開始=== sub not_dsp { print << "END_OF_DOC"; Content-type:text/html\n\n <HTML> <HEAD> <title>ファイル表\示の中止</title> </HEAD> <BODY TEXT="purple" BGCOLOR="#99ff99"> <B>ごめんなさい、testhtm.dat以外は表\示できないの。</B> </BODY> </HTML> END_OF_DOC } #===サブルーチンの記述終了===
本文がかなりすっきりして見やすくなったかと思います。
なお、上記のコメントは、あくまでも一例です。
こうしておけばいざとなった時、修正もしやすいですし、ミスも少なくなります。