小池啓仁 ヒロヒト応援ブログ By はてな

小池啓仁(コイケヒロヒト)の動画など。

小池啓仁 ヒロヒト応援ブログ By はてな

サブルーチン引数の参照渡しについて

ここ数日、私を悩ませた「@_の要素アドレス可変問題」ですが・・・、結局、私の「参照渡し」についての認識不足が原因でした。
弾さんの力強い一言で閃きました。

Perlにおいて、引数を格納する配列@_は、常に参照(reference)です。値(value)ではありません。

http://blog.livedoor.jp/dankogai/archives/51076794.html

私は、「参照渡し」を知ってはいたのですが、どこかで、なぜかC言語でのポインター渡しと勘違いをしていたみたいです。


ということで、復習してみます。
まず、サブルーチン引数の引き渡しには以下の2種類があります。

  • 実引数の値が仮引数に渡される(値渡し)。
  • 実引数の参照が仮引数に渡される(参照渡し)。

値渡しは、仮引数を変更しても実引数は変更されません。
ポインター渡しも、実は、ポインターを値渡しているのです(C言語では、そのポインターの指すところが変更できる。参照に対して変更をしているわけではない)。
一方、参照渡しは、仮引数を変更すると実引数も変更されます。
これは、仮引数が実引数のエイリアスになっているからなのです。


つまり、参照が入っている仮引数に値を代入することは、実引数に代入することとイコールなのです。
しかし、Perlでは、仮引数の配列に対して、リスト値で一括代入が可能です。
すると、現状の参照がリスト値で上書きされて置き換わってしまうのです。
そして、この時は、実引数を変更することはないのです。


ということで、胸のつかえが取れました。
関係者の皆さま、ありがとうございました!