9.0 別のプログラムの挿入。require

プログラムが大きくなってくると、(1) 初期設定をする部分、 (2) 同じ処理をする部分、(3) 条件分岐によって来ない場合が多い部分 等をプログラム本体から分離した方が分かりやすくなります。 分離したプログラムを取り込むには、require を使います。この場合、 変数名が同じであれば、そのまま使えます。
(例題 9-0) 標準入力を読み込んで、p9-hen.pl に書いている変換規則に従って 出力します。(p9-0.pl)
#!/usr/local/bin/perl
$_ .= $a while($a=<>) ;  # 全ての入力行 $a をまとめて $_ にいれます。
require "p9-hen.pl";     # $_ を p9-hen.pl に書いてある変換規則で変換し
print;                   # 印刷します。

変換規則は必要に応じて、いくらでも変えられますので便利ですし、 また主プログラムは非常に見やすい形になりました。以下に p9-hen.pl の例を示します。
s/ka/か/go ;      # ka を か にかえます。
s/ki/き/go ;      # ki を き にかえます。
s/(hu|fu)/ふ/go ; # hu か fu であれば ふ に変換します。
s/(zya|ja)/じゃ/go ; # zya か ja であればじゃに変換します。
1;                # require で呼ばれた最後の印として必要。

注意: require で呼ばれた file の 最後には、1; がないといけません。

% p9-0.pl < toto で 実行してみて下さい。

9.1 サブルーチン(副プログラム)

非常に良く使われる処理、他のプログラムでも応用可能なプログラムは、 副プログラムとして分離した方が使いやすい。これを subroutine (サブルーチン) と呼ぶ。例えば、abc というサブルーチンは sub abc {...} という形をしていて、親のプログラムから、&abc($x,$y,...) という形で呼ばれる。$x や $y は サブルーチンに引き渡す変数の配列で、サブルーチン側では、暗黙の配列 @_ に入る約束になっている。

サブルーチンからもとってくる場合に変化していても、変化しなくても良い。 重要な点は、サブルーチンのなかで処理する場合に使う一時的な変数が、 親の変数と同じ名前であってはならないことである。同じだと、変数の値が 変化してしまう。これを避ける為に、local な変数の宣言をして、たとえ 同じ変数名であっても、別の変数として扱うことができる。これによってサブルーチンをブラックボックス的に一つのコマンドとして使うことができる。


(例題 9.1) サブルーチン a($x,$y) では、($x+$y,$x-$y) をする。また、関数 として &tan を定義する。(p9-1.pl)
#!/usr/local/bin/perl
$x = 1; $y = 2;           # $x, $y を定義、
($X, $Y) = &a($x,$y);     # サブルーチン a を呼ぶ。
print " x,y  : $x, $y\n"; # $x, $y を印刷。変化していない。
print " X,Y  : $X, $Y\n"; # 結果の$X, $Y を印刷。
print ' @_   :',"@_\n";   # 配列 @_ を印刷。すでになにもない。
@b = &a($y,$x);           # 今度は $y $x と順番を変えて a を呼び @b に代入。
print " main : $x, $y\n"; # $x, $y を印刷。変化していない。
print " main : @b\n";     # 結果の配列 @b を印刷。
#
print &tan(3.1415/4.0),"\n";# 関数 tan の例
#
sub a {            # サブルーチン a の始まり。
local($a, $b) = @_;# local な変数 $a $b に変数の値を引き渡す。
local($c, $d);     # local な変数 $c $d を宣言する。
$c = $a + $b ;
$d = $a - $b ;     # 和と差を取る。
print " sub a: $a, $b, $c, $d\n"; # サブルーチン a の local な変数を印刷。
($c,$d) ;          # 結果の 配列の値を返す。
}                  # サブルーチン a の終了。
#
sub tan {
local($th) = @_;   # local な変数 $th に変数の値を引き渡す
sin($th)/cos($th); # sin($th)/cos($th) の値を返す。
}

subroutine では、何の値を返さないでも良い。逆に沢山の値を返したい場合には、 配列にすべて詰め込むか、local でない grobal な変数にサブルーチンの中で 代入すれば良い。サブルーチンの中で、grobal な変数を変化させることは、 あまり奨励しない。それは、サブルーチンを プログラムの部品として、 使えなくなるからである。

sub a{...} は別の file にあって、require しても良い。沢山の 便利な サブルーチンの集まりをライブラリーと呼ぶ。ライブラリーの場合には、 require した file の最後に 1; をつけるのを忘れないことが必要である。 1; がないと require が成立したか perl が 判定できないからである。

9.2 ライブラリーの作り方、使い方

9.1 のようにして作られた、サブルーチンは既にたくさん容易されていて、 普通の unix の計算機では、/usr/local/lib/perl にある。ここにある *.pl という file は、perl の中で require{*.pl}; とすれば、使うことができる。 それぞれの サブルーチンの使い方は、そのサブルーチンの先頭に書いてあるので、試しにいろいろ使ってみると良い。perl のプログラムのある、directory のライブラリ も 同じ require で呼び出すことができる。どの directory にある ライブラリー ファイル を検索してくれるかを、

#!/usr/local/bin/perl -I/usr/local/lib/perl

のように指定できます。


(例題9-2) ctime.pl を読んで、時刻を unix の様に表示する。(p9-2.pl)
#!/usr/local/bin/perl
require("ctime.pl"); # /usr/local/lib/perl/ctime.pl を 呼ぶ。
print &ctime(time) ; # 時刻を表示する。time は、1970/1/1 よりの秒数。

ライブラリーのなかには、perl の パッケージとは別に配布されているものも あるので、近くの anonymous ftp サイトで取り寄せると良い。

どのようなライブラリーがあるかというと、jcode.pl (日本語のコー ド変換ライブラリ)、 bigint.pl (任意桁の整数演算)、wish.pl (X window の toolkit (Tcl/TK) とつないで Window の操作)、tip.pl (RS232C への入出力インターフェイス)、socket.ph (LAN へのソケット) などあるので、詳しくは参考書などを見て欲しい。 perl の単独のコマンドとして、latex2html、jlatex2html ( LaTeX から html への変換)、a2p (awk から perl への変換)、s2p (sed から perl への変換) texi2html (texinfo から html への変換)、 man2html、plain2 (plain file からLaTeX への変換)、などほとん どの言語間の変換が perl のコマンドとして存在している。これら は、anonymous ftp サイトで検索して見て下さい。