2011年4月5日火曜日

サブルーチンを定義する

Perlでは、ほかの言語と同様にサブルーチン (subroutine:ユーザ定義の関数) を定義することができます。これを利用することで、何度も再利用することが可能になります。

サブルーチンの定義
■下記のように定義します。

sub ${subrootine} {
        body;
}

sub と subrootineの名前を置き、その後ろにbody(コード)を置き、ブレースで囲みます。
例えば、以下のように書きます。

sub hello {
        print “Hello, Perl ! “;
]

■Perlのサブルーチンの特徴としては、下記に挙げるものです。
・サブルーチン定義は、プログラムファイルのどこに置いても構いません。
・サブルーチン定義は、特別な処理をしない限りグローバルです。
・同じ名前を持つサブルーチンが2つあると、後ろに置かれたものが、前に置かれたものを上書きします。


戻り値
■Perlでは、サブルーチンの戻り値を単純にしました。
つまり、サブルーチンの中で最後に行われた計算の結果を自動的に戻り値にしました。
例えば下記のコードを作成します。

#!usr/bin/perl

sub hello {
print "Hello Perl !\n";
$num1 + $num2;
}

$num1 = 1;
$num2 = 2;

$num3 = &hello;
print "\$num3 is $num3.\n";

$num4 = $hello;
print "\$num4 is $num4.\n";



結果は下記のとおりです。
Hello Perl !
$num3 is 3.
Hello Perl !
$num4 is 3.

つまり、$num1 + $num2 が戻り値になります。


■誤って、サブルーチンの最後の行にコードを加えてしまったらどうなるでしょう。

#!usr/bin/perl

sub hello {
print "Hello Perl !\n";
$num1 + $num2;
        
print “It is mistake!”;
}

$num1 = 1;
$num2 = 2;

$num3 = &hello;
print "\$num3 is $num3.\n";

$num4 = $hello;
print "\$num4 is $num4.\n";


結果は下記の通りです。
Hello Perl !
It is mistake!$num3 is 1.
Hello Perl !
It is mistake!$num4 is 1.

printの表示が成功したことを示す ” 1 “ の値が戻り値になっています。
$num1 + $num2 の値はどうなるのでしょうか?Perlはそれを捨ててしまいます。
もし、警告を有効にしておくと、下記のメッセージも出力されます。

Useless use of addition (+) in void context at subrountine_sample_1 line 5.


■最後に評価された式を返す
下記の式を見てみましょう。
subroutineで最後に評価される式としては、$num1もしくは$num2のどちらかです。

#!usr/bin/perl

sub larger_num1_or_num2 {
if ($num2 < $num1) {
$num1;
} else {
$num2;
}
}

$num1 = 1;
$num2 = 2;

$large_number = &larger_num1_or_num2;

print "\$large_number is $large_number.\n";



引数
サブルーチンに対して引数を渡すには、サブルーチンの直後にリスト式を置きます。
$n = larger_num1_or_num2(10 , 15);

この引数は、サブルーチンを実行している間、自動的に特別な配列変数@_に代入されます。

#!usr/bin/perl

sub larger_num1_or_num2 {
if ($_[1] < $_[0]) {
$_[0];
} else {
$_[1];
}
}

$large_number = &larger_num1_or_num2(10, 15);

print "\$large_number is $large_number.\n";


return演算子
サブルーチンの残りを実行せずに、即座に値を返すのが、Perlのreturn文の使い方です。

0 件のコメント:

コメントを投稿