• ベストアンサー

サブルーチンの戻り値

galludaの回答

  • ベストアンサー
  • galluda
  • ベストアンサー率35% (440/1242)
回答No.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かと思います。 …と、かなり駆け足な説明ですがどうでしょうか(汗

参考URL:
http://www.rfs.jp/sb/perl/02/10.html, http://www.graco.c.u-tokyo.ac.jp/~nishi/programming/perl/my.html
tmk2z
質問者

お礼

がるさん、 大変分かりやすい回答、ありがとうございます。 助かりました。 まだメモリの使い方に関して、よくわかっていなかったようですね… すみませんでした。 ちょっと勉強します。 基本的には、データ処理にPerlを使用しますが、何か良い書籍をご存知ですか? (今後は幅を広げないですが…) いずれにしろ、大変ありがとうございました。

関連するQ&A

  • リファレンスをサブルーチンの戻り値にしてもOKですか?

    ■ サブルーチン内部で処理した結果を格納した、配列、ハッシュ、スカラーなどのデータを戻り値として利用する必要があります。その場合、どうするのが標準的なやり方でしょうか? ■ return (配列へのリファレンス, ハッシュへのリファレンス, スカラー); などとやってしまっても問題はないでしょうか? ■ 下のプログラムを試したところ、予想に反しちゃんと 「31415」と表示されました。 #!/usr/bin/perl -w sub subroutine{ my @a = (3, 1, 4, 1, 5); return \@a; } my $b = subroutine{}; print @$b; ■ サブルーチン内部で使用した変数へのリファレンスをサブルーチン 外で使っていいのだろうか? サブルーチンの処理が終了した時点でサブルーチン内部で使用した 変数はメモリーから消去されるのかと思ったものですから。

    • ベストアンサー
    • Perl
  • ACCESSのVBAでのサブルーチンへの引数と戻り値について

    教えてください。 AccessのVBAで、標準モジュールに作ったサブルーチンに1つの引数を渡して、複数の戻り値(例えば「果物」を渡して、「りんご」「みかん」「いちご」をそれぞれ受け取る)を取得したいのですが、どのようにしたらよいのでしょうか? よろしくお願いします。

  • サブルーチンについて

    サブルーチンについて教えて頂きたいのですが HTMLからPOSTされる複数のデータ(Key=A&値=B…)をkeyごとにサブルーチンの引数 として渡したいのですが、現在は「&ReadParse」を使って$inから値を取り出しています。 ただ数十個の値が一度にPOSTされる為、下記のコードをひたすら書く感じになってしまう のかな…と思ってお尋ねしております。 それから、サブルーチンからの戻り値を、フォームに(Key=A&値=B…)の感じで返したいのですが どうすればいいのでしょう。 @pairs = ($in{'val1'},$in{'val2'},$in{'val3'},$in{'val4'},$in{'val5'}); ($para1,$para2,$para3,$para4,$para5) = @pairs; $values = func($para1,$para2,$para3,$para4,$para5); 私自体、Perl初心者でわかっていない為、なにか方法があれば教えて下さい。宜しくお願いしますm(__)m

    • ベストアンサー
    • Perl
  • Perlです。サブルーチンについて

    以下の文はあっていますでしょうか。 # サブルーチンを呼び出して引数は 3 とする。 # そして返ってきた戻り値を変数$aに代入せよ。 $a=&a(3); # サブルーチン名aせよ。 sub a{ # $_[0]が引数 3 となりプラス1して変数$bに代入せよ。 $b=$_[0]+1; # 変数$bの内容を戻り値として返せ。 return $b; } # 変数$aの内容を表示せよ。 print "$a";

    • ベストアンサー
    • Perl
  • 【Perl】サブルーチンから多次元配列を戻したい

    【Perl】サブルーチンから多次元配列を戻したい サブルーチン内で作った2次元配列と1つの変数(例:@listと$i)をリターンしたいのですが、どのようにすれば良いでしょうか? ↓サブルーチン(calc) return (@list, $i); ↓メイン my $a = 12; my (@list, $i) = &calc($a); 間違っていると思いますが、現時点でのプログラムを一部書きました。 ご回答よろしくお願いします!

    • ベストアンサー
    • Perl
  • サブルーチンからサブルーチンを呼び出す

    #平均を求める,サブルーチンを使用 @dat=(1,2,3,4,5,6,7,8,9,10); $mean=&mean(@dat); print "mean="; print $mean; sub mean{ $sum=&sum(@dat); $n=@dat; $mean=$sum/$n; return($mean); } sub sum{ for($i=0;$i<$n;$i++){ $sum+=$dat[$i]; } return($sum); } Perlを勉強し始めたのですがサブルーチンの所で分からない所があるので教えていただけませんか? mean関数(Perlではmeanルーチンなどと呼ぶべきでしょうか?)の中でsum関数を呼び出してデータの合計を$sumに代入したいのですが,この場合だとうまく代入されていないようなのですが,何がよろしくないのでしょうか?

    • ベストアンサー
    • Perl
  • 関数の戻り値が複数ある場合

    C言語初心者です。 関数の戻り値を返す場合、return 変数名;と記述しますよね。 配列を返す場合、ポインタを使用しないで返すにはどうしたらいいですか? 例えば合計と平均を計算する関数があり その結果を配列に入れてmainに返すなど。 以前他の方の質問のコメントに 配列の要素が固定であれば、構造体にして返す方法もあります。 struct array { int x[10]; }; struct array func() {  struct array a;  ...  return a; } -- とあったのですが、構造体の要素が全てint型ならば 配列ではダメなのですか?

  • 配列サイズを明示せずサブルーチンに渡す方法

    プログラムのメインの方で2次元、3次元の高次元配列を設定してそれをサブルーチンに引き渡すことを考えています(しょっちゅうやっていることですが)。 この場合、サブルーチン側に汎用性を持たせるためにできるだけ配列のサイズを自動で渡すようにしたいと思っています(メインが変わるとそれに応じて自動対応)。そうしないとサブルーチンが汎用化せず、ケースバイケース(メイン側の配列のサイズが変わる場合それに応じてコードを書き変えなければならない)に応じなければならず、うっかりミスの間違いもおこりそうです。 配列のサイズを決めないサブルーチンの書き方を教えて頂きたいのですが。 なお、今回は配列はデータとして参照するだけで書き換えることはありません。 言語ですが、”サブルーチン”というだけあってFortranです。(Cのカテゴリだと答えを頂けるかなと思っているのですが。他に適当なところも無いようですが)

  • Perlの戻り値について

    配列の戻り値が理解できていないのですが、 Perlで正しく動作させるためには どのように記述したら良いのでしょうか? 戻り値の動作を詳しく書いてある(出来れば図入りで) 本はありますか? 例) sub a { my @a = ('A'); return (@a, "B", 2); } my (@a, $b, $c) = &a; print "a=[@a] b=[$b] c=[$c]\n"; # a=[A] b=[B] c=[2] # これを期待していたが # a=[A B 2] b=[] c=[] # こちらになる

    • ベストアンサー
    • Perl
  • マイコン組み込みC言語の戻り値について

    例えば、 unsigned char kansuu(){ 文   return = 1   文 } のような戻り値がある関数の場合、return = 1 と書くと、 その関数の最後の } まで飛んで離脱してくれます。 そのことを利用して、戻り値がない関数の場合でも return と書いたら、その関数の最後の } まで飛んで離脱してくれるのでしょうか。 意図としましては、関数内である条件を満たすと、 その関数を離脱するようにしたかったからです。 マイコンはルネサスのr8cです。 そもそも、戻り値がない関数でも場合でも、 return を記述しても良いのでしょうか?