perl 参照 覚え書き (perlreftut編)

全部箇条書きです。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でやっても成功する。もちろん普通は==を使う。

Leave a Reply

Your email address will not be published. Required fields are marked *

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)