サブルーチンからサブルーチンへ

とりあえず、内容を簡単にしようと、サブルーチンを作ってみます。


#メイン処理
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)受け取ったり(@_;)しなくては
いけないんですね。

MEMO++++++++++++++++++++++++++++

my @onepiece2 = eastblue(); #受け取る
grandline(@onepiece2); #渡す



sub eastblue{
my @onepiece = ("rufy,zoro,sanji,nami,tyopper");
return @onepiece; #返す
}


sub grandline{
my @onepiece3 = @_; #受け取る
push(@onepiece3,"robin");
print @onepiece3; #表示
}