以下のサブルーチン使った例のための(あまり意味のない) プログラムをp1.pl というファイル名で保存し, 実行パーミッションを与えて (chmod 755 p1.pl) 実行せよ.
#!/usr/bin/perl -w use strict; my $n; sub f1_1 { my ($number) = @_; my $result = 1; return $result; } for ($n = 2; $n <= 100; $n++){ if (&f1_1($n) == 1) { print "$n\n"; } }
図1.1 p1.pl
p1.pl のサブルーチン f1_1 は最後に値を return で返すタイプの 関数である.f1_1 では最初に $result に 1 を代入し,何もせずに $result を返しているのでこの関数は常に 1 を返す.
ここからの例題では 1 が真,0 が偽を表すとして作製するので このプログラムのメインルーチンで f1_1 が呼ばれたときは常に 真を返すことになるのでループ変数 n で与えられる 2 から 100 の整数すべてについて if 文の括弧内が真に なり,結果として全てが出力される.出力を実際に確認せよ.
次にサブルーチンf1_1を基に,2の倍数でないときだけ 真を返すサブルーチンを作る.以下のように作ればよい. p2.pl として保存し,実行権限をつけて実行せよ.
#!/usr/bin/perl -w use strict; my $n; sub f1_2 { my ($number) = @_; my $result = 1; if ($number % 2 == 0){ $result = 0; } return $result; } for ($n = 2; $n <= 100; $n++){ if (&f1_2($n) == 1) { print "$n\n"; } }
図1.2 p2.pl
関数名が f1_2 に変更されたのでそれを呼び出すメインルーチン内の 関数名も f1_2 に変更しなければいけないことに注意する.
f1_2 内部のロジックは, 「最初に result を 1 と置いておき,2 で割れたら 0 に書き換える」 というものである.2 の倍数であれば result が 0 に書き換えられて 関数 f1_2 は return 文で 0,すなわち偽を返す. 2 の倍数でないなら result は書き換えられずに関数の最後まで到達するので result が 1 のまま return される,すなわち真を返すことを利用している. 出力結果として 2 から 100 のうち 2 の倍数以外(奇数)が出力されていることを 確認せよ. 関数 f1_2 は「2の倍数でないときに真(1),それ以外は偽(0)を返す関数」である.
2 でも 3 でも割れないと真を返し,それ以外は偽を返す関数 f1_3 は以下のように書ける.なぜ正しいか考察せよ.
sub f1_3 { my ($number) = @_; my $result = 1; if ($number % 2 == 0){ $result = 0; } if ($number % 3 == 0){ $result = 0; } return $result; }
図1.2 関数 f1_3
2 から順に 10 までの整数を 図1.2の関数 f1_3 に入力として 与えた返り値を出力するプログラム ex1_2.pl を作れ. 図1.2の関数 f1_3 の内容は変えてはいけない.
2 から順に 10 までの整数を 図1.2の関数 f1_3 に入力として与えたとき, 返り値が 1 になるものだけについてf1_3への入力の値を出力するプログラム ex1_3.pl を作れ. 図1.2の関数 f1_3 の内容は変えてはいけない.