全部箇条書きです。man perlreftutの要点を書いています。(前回)
参照を得る。
参照を得るには\をつければいい
$aref = \@array;
$href = \%hash;
$sref = \$scalar;
[ ITEMS ] は配列への参照を返す。{ ITEMS }はハッシュへの参照を返す。
$aref = [ 1, "foo", undef, 13 ];
$href = { APR => 4, AUG => 8 };
参照を使う。(その1)
$arefを配列の参照とした場合、以下のように使う。@aは普通の配列として比べて書いている。右と左は同じ意味。
@a |
@{$aref} |
reverse @a |
reverse @{$aref} |
$a[3] |
${$aref}[3] |
そしてこれらはさらに省略して書ける。右と左は同じ。
@{$aref} |
@$aref |
${$aref}[1] |
$$aref[2] |
ハッシュの場合も同じなので省略。要は{$ref}と書けば、参照先を意味する。
参照を使う(その2)
その1のやり方で全部できるが、他の書き方もある。それが以下、右と左は同じ意味。
${$aref}[3] |
$aref->[3] |
${$href}{red} |
$href->{red} |
応用編
1、配列の配列を作る。
@a = ( [1, 2, 3],
[4, 5, 6],
[7, 8, 9]
);
$a[1]->[2]
の値は6になる。
さらに実は省略できて、$a[1]->[2]
は$a[1][2]
と書ける。
まとめると以下の3つはすべて同じ。
${$a[1]}[2] |
$a[1]->[2] |
$a[1][2] |
C言語を知っていれば、参照はポインタみたいに考えればいい。よって以下のように参照をコピーしても参照の中身のコピーしない。
$aref2 = $aref1
コピーが欲しい場合は以下のように書く。
aref2 = [@{$aref1}];
ref関数を使えば、$aref
が参照かどうかがわかる。参照の場合はtrueを返す。しかし実際に返す値はハッシュへの参照なら”HASH”、配列への参照なら”ARRAY”という文字列を返す。
参照を文字列として読むと以下のような値になる。
ARRAY(0x80f5dec)
または HASH(0x826afc0)
ということは参照の比較は==でやってもeqでやっても成功する。もちろん普通は==を使う。