2008年03月05日(水) 16:19

Perlのリファレンス・デリファレンスの概念

Perlのリファレンスは、ギターで言うところのFコードみたいなもん。
これを越えると、がぜん世界が広がる。

my $a = 5;


単純なスカラー変数に値を代入しているコード。
$a という変数に「5」が代入されています。


画で描くとこんな感じです。
20080305-01.gif


箱に値が収められてるイメージですね。


配列変数ならこう。
20080305-02.gif


連想配列(ハッシュ)ならこんなん。
20080305-03.gif


スカラー、配列変数、連想配列(ハッシュ)が変数の基本で、次にお題目の「リファレンス」という概念が出てきます。


リファレンスとは

リファレンスは結構くせもので、これが理解できずに挫折する人も多いのではないかと思います。


リファレンスは、直訳すれば「参照」という意味で、Perlのプログラミングにおいては「変数のある場所」くらいにイメージすれば良いと思います。
画に描いた箱の例で言えば、「箱の置き場所」がリファレンス。


と、言ってみたところで、まだ分かりにくいと思いますので、ちょっと具体的に。

コードとその出力でリファレンスを見る

リファレンスの値は変数に「\」(バッククオート)をつければ取得できる。


my $a = 5;
print $a;  # 5
print \$a# SCALAR(0x8065a70)


$a のリファレンス、\$a は「SCALAR(0x8065a70)」というような文字列で表示される。
「SCALAR」は変数がスカラー変数であることを表していて、カッコの中の文字列は変数が記憶されている場所を表しています。
(実は、リファレンスの値自体は時と場合によって変わるので、あまり意識しないくてもかまいません)


画で描くとこう。
20080305-04.gif


わかりにくいですか? 家に例えたものと並べてみましょう。
20080305-05.gif


そう、箱だと思ってたものは家だと思えばいいんです。
そして、リファレンスはその家の住所みたいなもんだと思えばいいんです。
リファレンスってのは、変数の住所なわけです。

デリファレンス

以下のように、\$a の値をもった $aref の頭に $ をつけると、もとの $a の値を得ることができます。
これを専門的には「デリファレンス」と言います。


my $a = 'str';
my $aref = \$a;  # リファレンス
print $aref;     # リファレンス出力 SCALAR(0x8065a70)
print $$aref;   # デリファレンス   str


デリファレンスは、住所から家の値を得るって感じ。


まとめ

リファレンスとデリファレンスは、変数だけかと思っていたら、実はサブルーチンなんかにもあったりして、オイラもいまだに完全には理解できてなかったりします><
ま、いずれにせよ、とにかくひとつ大事なことは、変数には値が代入されるだけでなく“その変数の在る場所を指す値(リファレンス)”も持っているということです。


細かいことを言い出すとキリがありませんが、リファレンスを覚えたら、サブルーチンに複数の連想配列を別々に渡せる!
(いや、他にもリファレンスの使いどころがあるのは知ってます)


、、、ってな感じで理解してますが、合っとるんかいな?( ´ 3`)




[2008/04/12追記]


きょう、本屋で「Perlの絵本」なる本を見つけて、ぱらぱらと立ち読みしてみたら、もうほとんどこのエントリーと同じような説明がされていて驚いた。住所には例えてないみたいだけど、画のタッチまで似ていてたまげた。
これは、読んだことのある技術書をどこかに明示しておいた方が良い気がしてきた。

あなたのコメントをお待ちしています。

名前  クッキーに保存 
このエントリーへのコメント(1件)

とても分かりやすく説明されていて良く理解できました

エントリーナビ
Perlのリファレンス・デリファレンスの概念」は、
Perl カテゴリーの記事です。


関連エントリー
変数の命名規則について
Perlの変数:多次元配列とかリファレンスとか
Perlのリファレンス実践メモ
PersistentPerl(SpeedyCGI)のメモ
モダンPerl入門届いたので読んだ

トラックバック
このエントリーへトラックバックするURL (言及リンクのないトラックバックは無効です)