Perlのリファレンス周辺について、すこし調べた。
Perlのラクダ本の8章、9章。
日本語なのに外国語に見える部分がまだある。
リファレンスに対して、デリファレンスという言葉がある。
全てに優先する基本原則:「Perlは暗黙のうちにリファレンスしたりデリファレンスすることはない」
$value_ref = ¥$value
これがリファレンス
$$value_ref
これがデリファレンス
無名なんとか
@array = [ 'Shibuya', 'Akihabara', 'Odaiba' ];
$array_ref = ¥@array;
これが普通の配列とそのリファレンス。
無名配列はこれをいっぺんにやってしまう。
$array_ref = [ 'Shibuya', 'Akihabara', 'Odaiba', ]
無名配列には配列の名前はないけどリファレンス(番地)だけある。
リファレンスには二種類ある
- シンボリックリファレンス
- ハードリファレンス
ただ、リファレンスと言った場合、ハードリファレンスの方。
ハードリファレンスは、
リファレンスとして変数の番地を格納しており、
番地をもとにリファレント(referent: 参照されるもの)を探す。
番地がわかればそこに直接アクセスすることで、
きちんと変数の値を取得する事ができるので、
確固としたもの、という意味でハードの名を冠しているのである。
一方で、シンボリックリファレンスは、
リファレンスとして格納しているのは変数の名前である。
なので番地がわからない。
そこで、一旦シンボルテーブルの中をさがして
目的の変数を探し出さなければいけない。
デリファレンスするひとつの方法として:矢印演算子
$ $arrayref [2] = "Dorian";
${ $arrayref }[2] = "Dorian";
$arrayref->[2] = "Dorian";
この三つは等価。
$array[3]と$array->[3]は同じではない事に注意。
矢印演算子は左から右へと結合するので、矢印の左側に
別のデリファレンスを置く事も出来る:
print $array[3]->{"English"}->[0];
ハッシュに関して。
%hash = {
red => 0xff0000,
green => 0x00ff00,
blue => 0x0000ff,
};
ハッシュを書く時にこう書くことは多いと思う。
この時、「=>」という演算子にはコードがより見やすくなる、
という利点だけではなくて、
左側の裸のワード(ベアワード)をクォートするという役割が
あるらしい。
クォートに関して。
q(My name is John)
qq(My name is John)
は
'My name is John'
"My name is John"
となる。(リテラル文字列)
これに対し、
qw(My name is John)
は
( 'My', 'name', 'is', 'John' )
となる。(ワードリスト)
文字列をまるごとひとかたまりに扱うのと、
文字列をスペースで区切られた配列として扱うのの違い。
localとourとmy
はっきりいってlocalとourとmyを適切に使う自信はないし、
myはともかくlocalとourの違いや役割がいまいちわかっていない。
ラクダ本によいヒントが書かれていた。
大幅に単純化して言うと、
ourは名前をスコープ内に限定し、
localは値をスコープ内に限定し、
myは名前と値の両方をスコープ内に限定する。