blog20100901

2013/08/20 - プログラミング言語 Perl にまつわる etc. - Perl monger
参考 : perldoc, perldoc.jp, search.cpan.org, perldoc.perl.org ...
「 初めての Perl 第 6 版 」(オライリー・ジャパン発行 ISBN978-4-87311-567-2) 」
「 続・初めての Perl 改訂版 」(オライリー・ジャパン発行 ISBN4-87311-305-9) 」
「 Effective Perl 第 2 版 」(翔泳社発行 ISBN978-4-7981-3981-4) 」 ... etc,.

Perl Perl_0

Perl 「 サブルーチン (Subroutine) 」: 戻り値 (0x30)

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)の記事
 Perl mp2 翻訳 Web コンテンツ圧縮の FAQ (d228) (2023-10-11 23:49)
 Perl mp2 翻訳 既知のブラウザのバグの回避策をいくつか (d227) (2023-05-26 15:41)
 Perl mp2 翻訳 Perl と Apache でのキュートなトリック (d226) (2023-05-19 17:05)
 Perl mp2 翻訳 テンプレートシステムの選択 (d225) (2022-08-15 22:23)
 Perl mp2 翻訳 大規模 E コマースサイトの構築 (d224) (2022-06-15 20:43)
 Perl mp2 翻訳 チュートリアル (d223) (2022-06-15 20:42)
上の画像に書かれている文字を入力して下さい
 
<ご注意>
書き込まれた内容は公開され、ブログの持ち主だけが削除できます。

Llama
リャマ
TI-DA
てぃーだブログ
プロフィール
セラ (perlackline)
セラ (perlackline)
QRコード
QRCODE
オーナーへメッセージ

PAGE TOP ▲