- ベストアンサー
サブルーチンの戻り値
すみません、教えてください。 サブルーチンの戻り値に、複数の配列を指定したいと思っています。 return(@data1,@data2,@data3,@data4); これら配列を戻り値として渡す時、4つの配列として渡す場合 サブルーチンを呼ぶ時はどのように記述すればよいでしょうか? それぞれ、配列のデータ量が違ったりしています。 やはり一度、一つの配列としてそれを区分していくやり方しかないですかね? よろしくお願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
がるです。 んっと………わかりやすい文章で手短に説明する自信がないのですが…頑張ってみます(苦笑 まず、変数データ(に限りませんが)は全て「メモリ」と呼ばれる場所に格納されてます。 んで、通常の @data1 って指定だと、それは中身を直接やり取りしていまして。 return @data1 ってやると、それは「(@data1の中身の)1と2と3と4と5を戻します~」って感じでデータが格納されていきます。 で、 @retdata1 = 関数(); はそれにしたがって 「はいよ~。んじゃ、1と2と3と4と5とを受け取りました~」って感じでデータを受け取って、それを@retdata1に格納します。 一方で。Perlで変数の前に¥をつけると、それは「データが格納されている場所を教えます~」って意味になります。 つまり、 return \@data1 ってやると、それは「@data1はxxxって住所に入ってるです~」っていう、住所情報(アドレス)だけを返します。 で、 $retd1 = 関数(); はそれにしたがって 「はいよ~。んじゃ、住所のデータを受け取りました~」って感じで受け取ります。 で、次に出てくる @retdata1 = @$retd1 ってのは、 「@retdata1っていう配列に右辺の配列の中身をCopyして」って意味なのですが。で、右辺の分析です。 まず@xxなので「配列だなぁ」ってのがわかるですっていうか配列じゃないと左辺と合わないから困るので(苦笑 で。xxの部分、通常は例えばdata1とかなので「ああdata1って名前が付いてる配列ね」って探しに行くのですが。 これが$xx(今回は$retd1)だと「$xxっていう変数のところに格納されている住所にデータがあるはず~」っていう風に探しに行くです。 このあたりが、Perlで「参照」って呼ばれている変数の扱い方とその手法(の一部)になるです。 あと、「@data1 = @$d1;”このように記述された配列、変数の有効範囲は」との事ですが。 そのあたりは、"Perl 変数 スコープ"あたりで調べてみるとわかりやすいかと。 今回はなにも書いていないのでlocalと同じ扱いになる(…と思った。微妙うろ覚えです ^^; )ので、全体的に広く有効だったかと。 個人的には、普段は常に my をつけるので、局所変数扱いで触ってます。で、その局所度合いは「左辺値」を基準にしてもらってOKかと思います。 …と、かなり駆け足な説明ですがどうでしょうか(汗
その他の回答 (3)
- natsuki_tk
- ベストアンサー率35% (99/279)
イメージとしては、 荷物をスーツケースに閉じこめ、 後ほどスーツケースを開いて中身を取り出す。 というような作業をしているわけです。 ex. my $case = \@data1; #スーツケースにいれる my @data2 = @{$case} #スーツケースから出す スーツケースにいれると「一個のもの」として扱えるようになります。 ですのでスカラー変数に収まるのです。 逆に戻す際はスカラーから配列になりますが、 書き方が何種類かあります。 慣れるまではちょっと紛らわしいかもしれません。 (慣れても、紛らわしいわけですが…) >配列、変数の有効範囲はどのようになりますでしょうか? 普通の配列と普通のスカラーと同じと考えて問題ありません。 さらに詳しいことはやはり書籍等を読んだ方が早いかもしれません。 たとえばAmazon.com経由で購入してみてはいかがでしょうか?
お礼
了解しました。 やはり、勉強が足りないようです。 ありがとうございました。 >さらに詳しいことはやはり書籍等を読んだ方が早いかもしれません。 お勧めの書籍があれば、教えてください。 何せ田舎なもので…本を選ぶのにも勇気が…
- galluda
- ベストアンサー率35% (440/1242)
がると申します。 んっと…ちょっと難しいかもしれませんが。「参照」という手法をつかうと、こういったやり取りが可能になります。 まず、returnは以下のように記述してください。 return(\@data1,\@data2,\@data3,\@data4); 次に、受け取る側はこのように。 ($d1,$d2,$d3,$d4) = 関数(); で…メモリ的にはちょっと…なのですが、取り合えずわかりやすく使いやすくを重視するために、以下の行を付け加えてください。 @data1 = @$d1; @data2 = @$d2; @data3 = @$d3; @data4 = @$d4; これで、複数の配列を受け取ることが可能かと思います。 で、時間があるときにでも、参照って言葉でgoogleあたりで調べてみると、色々と腑に落ちることも多いかと思います。
補足
!!出来ました。ありがとうございます。 だた、がるさんの言うとおりやったもので、意味がイマイチ分かりません。現在手元に本がなく、田舎のため書店にはPerlの本さえ おいていません。教えて頂ければと思います。(Webでも調べましたがイマイチ…) まず、return(\@data1,\@data2,\@data3,\@data4); ~~~~ ¥は展開しない、と言う意味でよいですよね? あと、“@$”とか…すみませんが… また、“@data1 = @$d1;”このように記述された配列、変数の有効範囲はどのようになりますでしょうか? よろしくお願いします。
- marimo_cx
- ベストアンサー率25% (873/3452)
受け渡しせずにいっそグローバル変数にしてしまえばどうでしょう?
お礼
がるさん、 大変分かりやすい回答、ありがとうございます。 助かりました。 まだメモリの使い方に関して、よくわかっていなかったようですね… すみませんでした。 ちょっと勉強します。 基本的には、データ処理にPerlを使用しますが、何か良い書籍をご存知ですか? (今後は幅を広げないですが…) いずれにしろ、大変ありがとうございました。