7.1 サブルーチン
- 最初の説明は簡単だったのに、練習問題が「ハノイの塔」
- うん、わからん。
&hanoi( 3, "左", "中央", "右" );
sub hanoi {
my ( $disk, $bar1, $bar2, $bar3 ) = @_;
if ( $disk > 0 ) {
&hanoi( $disk - 1, $bar1, $bar3, $bar2 );
print "円盤 $disk を $bar1 の棒から $bar2 の棒へ移動",
"\n";
&hanoi( $disk - 1, $bar3, $bar2, $bar1 );
}
}
- サブルーチンで階乗を求める練習問題
- for文とかでならすぐに作れるのに
- 無限ループで強制終了させる事、6回
- 自作ルーチン
return $sum
のところをelse外に書いてしまい、しばし悩む。
my $sum = 1;
my $num = 5;
print factorial($num,$sum), "\n";
sub factorial {
my ($num,$sum) = @_;
if ( $num > 1 ) {
$sum *= $num;
$num--;
factorial($num,$sum);
}else{
return $sum;
}
}
- 解答サンプル
- 式の中に直接サブルーチンを入れてるのが新鮮だった。そういうのアリなのか。
- 自分のと比べると、if文の正の条件のときではないときに式を入れてる。
- うちの場合は先に合致する条件を考えてからif文の条件式を作ってしまうからなぁ。
- 人のコードは勉強になる
my $number = 3;
print "$number! = ", &factorial($number), "\n";
sub factorial {
my ($number) = @_;
my $answer;
if ( $number <= 1 ) {
$answer = $number;
}
else {
$answer = $number * &factorial( $number - 1 );
}
return $answer;
}
- この章、
use strict
してるとまともに動かなかったり
- local変数がサブルーチン呼び出しでも使えるのは便利そう。
7.3 リファレンス
- Perl入学式以前はまったく理解できなかったけど、おかげでなんとかわかるように。
- 無名サブルーチンの素晴らしさがいまいち分からない
- 無名サブルーチンからの値を受けるときは
&
つかう
- 無名サブルーチンって英語でなんて言うんだろ?
- Subroutin Referances でいいんかな
7.4 ライブラリとリファレンス
- 特定の機能を実行するための汎用性のあるサブルーチンを集めて1つのファイルにしておき、それをスクリプトに組み込む方法
- メインルーチン開始時に実行される
BEGIN
,終了時に実行されるEND
という特別なサブルーチンを定義できる
ライブラリ
require ("lib-file")
で呼び出す。
- ライブラリのスクリプトの最後に
1;
をつける
- ライブラリの中でグローバル変数を定義すると、呼び出した側でもグローバル変数として扱われるので、環境設定ファイルとして利用する事も出来る
モジュール
use module
おなじみ
- 呼び出すときにディレクトリを含む事は出来ない
- 代わりに
File::Listing
というモジュールはFileディレクトリのListingというモジュールを意味する
パッケージ
- ライブラリやモジュール内で定義した変数の上書きを防ぐ事が出来る
- パッケージ内の変数にアクセスするときには
$package-name::variable
のようにアクセスする
7.5 色々なモジュール