リファレンスとは?

だいぶと期間があいたので、今回はリファレンスについて勉強したいと思います。
まずは、
・リファレンス
 リファレンスを一言で言うと実体へのアドレスになる。そのアドレス自体のコトをリファレンスと呼びます。

デリファレンス
 リファレンスが指す先にアクセスする事をデリファレンスと呼ぶ。 perlではポインタ演算が出来ないため、全てのリファレンスはデリファレンスしないと使う事が出来ない。変数へのリファレンスをデリファレンスした状態の場合、通常の変数と同様に扱う事が出来ます。


スカラーへの代入

 $hoge = "hoge";
 $data = \$hoge;
 print $$data; #hogeと表示される

・配列への代入

 @list = (100, 200);
 $scalar = \@list;
 ${$scalar}[0]; #100が表示される
 $$scalar[0];
 $scalar->[0];

・上記の$scalarには、@listが持つリスト値(正しくは配列)へのリファレンスが代入される。$scalarをデリファレンスする事により、通常のリスト変数と全く同じように使えるが、リファレンス自体はたった一つのスカラー値なのでスカラー変数に代入できる。

・上記の例では@listへのリファレンスになっているが、もし初めから「@list」と言う変数を使う気がないのならば初めから作らなくても構わない。
 その場合は、名前のない(変数名を持たない)実体とその実体へのリファレンスを生成する事が出来る。
  [ブラケット]は、内部にリストデータ(正しくは配列)を生成し、その実体へのリファレンスを返す。

 $scalar = [100, 200];
 $$scalar[1] #200が表示される

・ハッシュへの代入

 %hash = (
      'data1' => 100,
      'data2' => 200
     );

 $scalar = \%hash;
 $$scalar{'data1'}; #100が表示される
 ${$scalar}{'data1'};
 $scalar->{'data1'};
 
 $hash{'key'} = \$scalar;
 ${$hash{'key'}}->{'data1'};

・上記の$scalarには、%hashが持つハッシュへのリファレンスが代入される。 $scalarをデリファレンスする事により、通常のハッシュ変数と全く同じように使える。
 ハッシュでも、無名のハッシュデータを生成するコトが出来る。 {ブレス}は、内部にハッシュデータを生成し、その実体へのリファレンスを返す。

 $scalar = {
      'data1' => 100,
      'data2' => 200
      };

・矢印演算子(->)
 矢印演算子(->)は(->)の左側をデリファレンスする。

・優先順位
 まず、「$$scalar[0]」のように書いた場合、先頭の「$」は、添え字の[0]よりも強い。つまり「$scalar[0]」と見なされるよりも早く「$$scalar」と見なされる。よって、「$scalar」がデリファレンスされる。
 次にデリファレンスされた「$scalar」の後に添え字があるため、 $scalarはリストへのリファレンスであり、なおかつスカラー値 [0] にアクセスされていることになる。 {ブロック}を使うと「$」や「@」などの解釈よりも先に行われる。

 $scalar =	[
		 [
		  [
		   [
			[100, 200],
			[101, 201],
              ],
		      [
			[102, 202],
			[103, 203],
		       ],
		     ],
	            ],
		];

 ${ ${ ${ ${ ${ $scalar }[0] }[0] }[1] }[1] }[0]; #103が表示される

 $scalar->[0]->[0]->[1]->[1]->[0];#103が表示される

 $scalar->[0][0][1][1][0];#103が表示される

と、まぁリファレンスについて勉強しましたが、感想としてはこのリファレンスを使うことによって、いろいろなデータ構造を扱うことができそうですね!!