Perlの関数(サブルーチン)

PHPとの用語比較

・「サブルーチン」:PHPにおける関数

関数定義の書式

sub 関数名 {
 処理内容;
}

引数を設定

sub 関数名 {
 my($引数1,$引数2) = @_;
 処理内容;
}

「shift」を使うと、引数は1つしか受け取れない

sub 関数名 {
 my($引数) = shift;
 処理内容;
}

返り値を設定

sub 関数名 {
 処理内容;
 return 10;
}

sub 関数名 {
 処理内容;
 return ($変数);
}

sub 関数名 {
 処理内容;
 return (@配列);
}

関数名の付け方

・一般に、「動詞+目的」というフレーズでネーミングする

関数の定義場所

関数を定義する場所はどこでもかまわない

関数の呼び出し

・&関数;
・&関数();
・&関数(引数);
・&関数(引数1,引数2);

・返り値 = 関数;
・返り値 = 関数();
・返り値 = 関数(引数);
・返り値 = 関数(引数1,引数2);

関数の多段呼び出しとネスト

・関数内で、別の関数を呼びだすことが可能(関数の呼び出しを行うごとにスタックを消費するため、あまり深い関数呼び出しを行うと、プログラムが異常終了してしまう危険がある)
・関数内で、別の関数を定義することが可能。これを「関数のネスト」と呼ぶ

変数のスコープ(有効範囲)

・local(変数名); ローカル変数…有効範囲:宣言された関数と、呼びだされる関数
・my(変数名); プライベート変数…有効範囲:宣言された関数内のみ

関数呼び出しの2つの方法

・call by value
・call by reference

call by value

関数内で引数の内容をいくら変更したところで、呼び出し元の変数に何ら影響を与えない

sub foo {
 my($value) = @_;
 ここでいくら変数$valueの内容を書き換えても、呼び出し元の変数$nにはまった変化がない
}

foo($n);

call by reference

呼び出し元の変数の内容が書き換わる

sub foo {
 my($ref) = @_;
 変数$$refに値を書き込めば、呼び出し元の変数$nにも書き込まれる
}

foo(\$n);

再帰呼び出し

関数内から自分自身を呼ぶ