• ベストアンサー

リファレンスについて 1

リファレンスについて、いろいろ文献を調べて勉強中です。 自分の中では下記のように解決しているのですが、あってるかどうか聞いてください。 『ようはVBで言う参照渡し(ByRef)と同じで、値そのものを渡すのではなくアドレスを渡すので、サブルーチンで値が変更されてしまうとメインルーチンでの値も変わってしまう』

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

基本的には正解です。 ですが、アドレスと違うのは、リファレンスはアドレスではないということです。 アドレスとは、メモリの番地に相当しますが、リファレンスに格納されているのは番地ではありません。 リファレンスの主な使い方としましては、 関数に複数の、配列もしくはハッシュを渡すときです。 ご存知かと思いますが、普通に usr_function(@hairetsu1,@hairetsu2) などと渡しては、配列がくっついてしまい、どこが切れ目かの判定ができなくなります そこで、 usr_function(\@hairetsu1,\@hairetsu2) と、リファレンスで渡すと、関数の引数は2つのリファレンスとなり、 内部で @hairetsu1 = @$_[0]; @hairetsu2 = @$_[1]; と、読み出せば配列を配列のまま送ることが可能となるのです。 これは、関数の戻り値にも言えることです。 ほかの使い方としましては、無名の配列、ハッシュを使った多次元配列、多次元ハッシュなどです。 リファレンスは、アドレスと違い、いろいろと応用ができます。

cshoaucmoa
質問者

お礼

どうもありがとうございました。

cshoaucmoa
質問者

補足

shirousa01さん、ありがとうございました。 まだ2月より勉強し始めたところで、 usr_function(@hairetsu1,@hairetsu2) では配列がくっつくこともしらず、とても参考になりました。 Logでリファレンスした中身を見ると HASH(0x18afe98) といった形で記述してあったので、てっきりアドレスだと思っていました。でも、物理的には違っても考え方はそれでいい、ってことで理解してよろしいでしょうか?