燈明日記 このページをアンテナに追加 RSSフィード

ごあいさつ

燈明日記へようこそ!!

燈明日記の主なテーマは、以下の通りです。

そして、燈明日記へ来られたのも『私』と『あなた』の何かのご縁です。なので、どうぞごゆっくりご覧下さい!


2008/7/7(月)

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

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

弾さんの力強い一言で閃きました。

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

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

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


ということで、復習してみます。

まず、サブルーチン引数の引き渡しには以下の2種類があります。

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

値渡しは、仮引数を変更しても実引数は変更されません。

ポインター渡しも、実は、ポインターを値渡しているのです(C言語では、そのポインターの指すところが変更できる。参照に対して変更をしているわけではない)。

一方、参照渡しは、仮引数を変更すると実引数も変更されます。

これは、仮引数が実引数のエイリアスになっているからなのです。


つまり、参照が入っている仮引数に値を代入することは、実引数に代入することとイコールなのです。

しかし、Perlでは、仮引数の配列に対して、リスト値で一括代入が可能です。

すると、現状の参照がリスト値で上書きされて置き換わってしまうのです。

そして、この時は、実引数を変更することはないのです。


ということで、胸のつかえが取れました。

関係者の皆さま、ありがとうございました!

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/chaichanPaPa/20080707/1215431007