Perl Perl_0
Perl 「 サブルーチン (Subroutine) 」: 戻り値 (0x30)
Perl について、復習を兼ねて断片的な情報を掲載して行く連載その 0x30回。
Perl で、サブルーチン (Subroutine) の戻り値 (Return value) について。
サブルーチンの戻り値
サブルーチンは、何らかの処理をひとまとめにしたものです。通常そこには「 式 」が含まれます。
「 式 」は、何かしらの結果を導きますが、サブルーチン内の式で導かれた結果は、通常メインルーチンに「 戻され 」ます。
この「 戻された結果 」のことを「 戻り値 (Rerturn value) 」と呼びます。
Perl でのサブルーチンは、(その値が有用かどうかは別にして) すべて戻り値を返します。また、戻り値は、通常サブルーチンの中で、最後に計算 (評価) された式の結果になります。
$x = 1;
$y = 9;
$sum = &add;
print "x + y = $sum\n";
sub add {
print "You called subroutine.\n";
$x + $y; # この式の結果が戻り値になる
}
1 - 2 行目では、スカラ変数 $x と $y に数値 1 と 9 をそれぞれ代入しています。
4 行目では &add で、サブルーチンを呼び出しています。サブルーチン add の処理は、7 行目で定義されています。
7 行目にジャンプして処理を確認します。
まず、print 文で、「 You called subroutine. (あなたは 呼んだ サブルーチンを.) 」というメッセージを表示します。
次に、1 - 2 行目で定義したスカラ変数 $x と $y を呼び出して加算しています。この結果は ( 1 + 9 で ) 10 になります。
サブルーチン add の最後の式は、9 行目の加算 ( $x + $y ) になるので、戻り値は数値の 10 になります。
4 行目に戻ります。
4 行目ではサブルーチン add の値を、スカラ変数 $sum に代入しています。add の戻り値は数値 10 なので、$sum には数値 10 が代入されます。
5 行目の print 文では、変数 $sum の値を表示します。変数 $sum には、サブルーチン add の戻り値が入っているので、数値 10 が表示されます。
このプログラムを実行すると、次の様になります。
You called subroutine.
x + y = 10
サブルーチンの戻り値に対しては、次の 1 行目の様に計算式を当てることも出来ます。
$sum = 10 * &add;
print "x + y = $sum\n";
この場合の実行結果は、次の様になります。
You called subroutine.
x + y = 100
戻り値を得る際の注意点
上で説明した様に、Perl のサブルーチンでは、「 最後に計算 (評価) された式 」の値が戻ってきます。
つまり、次の様に書かれたサブルーチンは、おそらく失敗だということです。
sub add {
$x + $y;
print "You called subroutine.\n"; # Oops !
}
なぜこれが失敗なのかというと、この場合に最後に評価される print 文が返す値は、出力が成功したことを示す「 1 」だけだからです。
print 文の出力が成功したことを示す値 1 を、戻り値として受け取ったとして、この値をいったいどうすれば良いのでしょうか。ということです。
なお、サブルーチンの中で計算した「 $x + $y 」の値は、その後何にも利用されることなく破棄されます。
0x30 -> 0x31 へ
ちなみに、次のサブルーチンの戻り値は、3 行目の $x の値か、5 行目の $y の値になります。
sub compare {
if ( $x > $y) {
$x;
} else {
$y;
}
}
初心者の目で一見すると、$y が最後にある様に見えますが、ここで最後に評価される式は、else を含む if 文そのものです。
このため、$x と $y に入った値によって、戻り値に相当する変数が決められます。
参考情報は以下の書籍を中心に Wikipedia および各 Web サイト。それと詳しい先輩。
参考 :「Randal L. Schwartz, brian d foy, Tom Phoenix 共著 近藤 嘉雪 訳「初めての Perl 第 6 版」(オライリー・ジャパン発行 ISBN978-4-87311-567-2)」
次回 (0x31) へ続く。
過去記事 RSS
Perl mp2 翻訳 Web コンテンツ圧縮の FAQ (d228)
Perl mp2 翻訳 既知のブラウザのバグの回避策をいくつか (d227)
Perl mp2 翻訳 Perl と Apache でのキュートなトリック (d226)
Perl mp2 翻訳 テンプレートシステムの選択 (d225)
Perl mp2 翻訳 大規模 E コマースサイトの構築 (d224)
Perl mp2 翻訳 チュートリアル (d223)
Perl mp2 翻訳 既知のブラウザのバグの回避策をいくつか (d227)
Perl mp2 翻訳 Perl と Apache でのキュートなトリック (d226)
Perl mp2 翻訳 テンプレートシステムの選択 (d225)
Perl mp2 翻訳 大規模 E コマースサイトの構築 (d224)
Perl mp2 翻訳 チュートリアル (d223)