サブルーチンからサブルーチンへ
とりあえず、内容を簡単にしようと、サブルーチンを作ってみます。
#メイン処理
eastblue(); #サブルーチン呼び出し
grandline(); #サブルーチン呼び出し
#サブルーチン
sub eastblue {
my @onepiece = ("ruffy,zoro,sanji,nami,tyopper"); #麦わら海賊団をつくる
}
sub grandline {
push(@onepiece,"robin"); #麦わら海賊団にロビンを追加
print @onepiece; #海賊団表示!
}
麦わら海賊団にロビンを追加して、海賊団全部の名前を表示させようという寸法です。
結果
robin
当然ながら、失敗。恥ずかしいですが、何も知らないときはこんな風にしてました。
あら〜ロビンだけ仲間はずれですね。
サブルーチンを上から実行して、二つ目でプリントされるはずなのにおかしいです。
それぞれの配列だけを表示してしまいました。
リトライ2
配列の内容は、サブルーチンの中でしか使えないようなので、サブルーチンeastblue
で作った配列の値が次のサブルーチンに渡っていないようです。
そこで、サブルーチンeastblueの値を返してやることにします。
#サブルーチン
sub eastblue {
my @onepiece = ("ruffy,zoro,sanji,nami,tyopper"); #麦わら海賊団をつくる
return @onepiece; #作った配列を返す
}
sub grandline {
push(@onepiece,"robin"); #麦わら海賊団にロビンを追加
print @onepiece;
}
結果2
robin
え〜。なんで?返したのに〜。まだロビンはひとりぼっちです。
う〜ん。。。どうしたもんか。
リトライ3
配列の内容を返したんだけど、受けてないことに気づきました。
そうか〜サブルーチン実行のとこに返したんだから、向こうで受けてあげなきゃ。
#メイン処理
my @onepiece2 = eastblue(); #ここで、新しく作った配列@onepieceに、eastblueの実行結果を代入します。
grandline(@onepiece2); #サブルーチン呼び出し
この新しく作った@onepiece2をサブルーチンgrandlineに持っていかなきゃいけ
ないだろうなと思ったので、grandline(@onepiece2)とします。
そして、渡したサブルーチンgrandlineの中でも受け取らなくてはいけないので、
sub grandline {
@onepiece3 = @_; #新しく@onepiece3を作って、引数を受け取る
push(@onepiece3,"robin"); #麦わら海賊団にロビンを追加
print @onepiece3;
}
結果3
rufy,zoro,sanji,nami,tyopperrobin
できました!!!やっとロビンが仲間に加わりましたよ!!
tyopperrobinと、チョッパーとロビンのところにカンマがないのが証拠です!
配列を他のサブルーチンに渡すためには、返したり(return)受け取ったり(@_;)しなくては
いけないんですね。