少し前にPerlのリファレンスとデリファレンスについて書いた。
Perl: デリファレンス - Using MT
当時はリファレンス、デリファレンスというものがわかりそうでわからない、
そんな状態だった。
デリファレンスをあくまでリファレンスの逆、と理解するに留まっていた。
いまになってようやく「デリファレンスとは実体化だ!」と
断言できる確信がもてたので、
リファレンスと無名なんとかについて少しまとめを書いてみる。
* * *
配列とハッシュは、宣言するときの仕方があまりかわらない。
どちらも丸かっこで要素をくくる。
(丸カッコは英語で parenthesis という。)
配列:@array = ( 'cookie', 'cheese', 'wine', 'water');
ハッシュ:%hash = ( 'red', 'apple', 'yellow', 'banana');
ハッシュは次のようにも書ける。
%hash = ( red => 'apple', yellow => 'banana');
二つをペアにしてそれらを「=>」で結びつける。
その際、「=>」は左側の裸の要素(ベアワード)を
クォートで囲むという役割もある。
ハッシュはキーと値を対応づけるものなので、
「=>」で書く方が直感的だ。
さて。
配列のある要素を取り出すとき、次のように書く。
$array[0] #cookie
ハッシュのある要素を取り出すときは次のよう。
$hash{'red'} #apple
ここで注目して欲しいのは配列の時は、
添え字を囲うものとして「 [ ] 」という角カッコを使う。
(ブラケットとも呼ぶ。英語ではsquare bracket。squareは省略することもあり。)
一方、ハッシュは添え字を囲うものとして「 { } 」弓カッコを使う。
(ブレースとも呼ぶ。英語ではcurly brace。curlyは省略することもあり。)
くどいようだが、
・配列は [ ]
・ハッシュは { }
なのである。
ここで無名配列と無名ハッシュを考えてみよう。
僕はいつも無名配列を宣言するときや無名ハッシュを宣言するときに、
どのようなカッコで囲うのだっけな?と迷っていた。
その度にネットを検索しては正しいカッコを探していた。
もしかしたらそのようにカッコの種類がわからなくなるのは
僕だけかもしれないけれど、
僕にとってこれは大発見なので書かせてもらう。
僕だけかもしれない、と書いたのは、
その規則がとても合理的で一度覚えたら忘れないぐらい明白なものだからである。
配列の要素を取り出すときは $array[0] とやり、
ハッシュの要素を取り出すときは $hash{'red'} とやった。
配列は角カッコで、ハッシュは弓カッコなのである。
そう!無名配列、無名ハッシュの時も同じなのだ!
無名配列:$ref_array = [ 'funky', 'monkey', 'crazy', 'baby' ];
無名ハッシュ:$ref_hash = { 'man', 'male', 'woman', 'female'};
もうこれで、無名配列を作るときは丸かっこ?角カッコ?弓カッコ?と
悩まなくて済むのである。
これで無名配列、無名ハッシュの作り方はわかった。
無名配列も無名ハッシュもどちらも変数名はないが、
リファレンス(番地)がある状態である。
普通の、変数名のある変数のリファレンスは逆スラッシュ演算子を
使えば生成することができる。
\@array あるいは ¥@array
\%hash あるいは ¥%hash
と、こんな感じである。
逆スラッシュ演算子と書いたが「 \ 」の代わりに「 ¥ 」でも代用できる。
(Macユーザはaltを押しながら¥キーを押すと \ が打てる。)
そうしていよいよデリファレンスである。
デリファレンスとは実体化のことである。
いま、無名配列・無名ハッシュも
逆スラッシュ演算子をつけてリファレンスにした配列・ハッシュも
どちらもリファレンスの状態である。
そこにはメモリ上の番地が記されているに過ぎない。
試しに「 print \@array 」とやってみるといい。
それをデリファレンスすることで、実体、すなわち配列・ハッシュ自身に
アクセスできるようになる。
無名配列・無名ハッシュをデリファレンス(実体化)
@$ref_array で配列自身、 $$ref_array[0] でその配列の0番目の要素。
%$ref_hash でハッシュ自身、$$ref_hash{'yellow'} でそのハッシュのキーがyellowの要素。
もう一つ、矢印演算子を用いる方法がある。
$$ref_array[0] は次のように書ける: $ref_array->[0]
$$ref_hash{'yellow'}は次のように:$ref_hash->{'yellow'}
$が二つ並ぶよりも、「 -> 」を使う方が直感的な表現だろう。
その配列がハッシュの配列になっている場合、
$ref_array->[0]->{'pink'}
なんて書き方もできる。
詳しくは書かないが研究してみて欲しい。
最後に、以下の三つは等価である。
$$ref_array[2] = "Dorian";
${$ref_array}[2] = "Dorian";
$ref_array->[2] = "Dorian"