リファレンス(3) 無名配列、無名ハッシュ

(ハード)リファレンスは、値を直接参照するものなので、変数ではなく値からリファレンスを作る事ができました。
Perl には便利な構文があって、無名な配列へのリファレンス、無名なハッシュへのリファレンス、無名な関数へのリファレンスをそれぞれ簡単に作成する事ができます。
「無名な」とは、変数に入れられていない(名前が付けられていない・匿名の)値の事を指します(リテラルな値)。無名だけど値は値なので参照する事はできるのです。
無名配列と無名ハッシュのリファレンスを得るにはそれぞれ添え字と同じカッコを使います。つまり、配列なら [ ]、ハッシュなら { } ですね。

# ref3.pl
 
my $arrref  = [ 123, "abc", 4.56, "def" ];
 
my $hashref = { apple => "red", banana => "yellow" };
 
print "@$arrref\n";
print "$$arrref[0]\n";
print join " ", keys %$hashref, "\n";
print "$$hashref{apple}\n";

$arrref は無名配列へのリファレンス、$hashref は無名ハッシュへのリファレンスとなっています。
リファレンスなのでデリファレンスできます。@$arrref や %$hashref はでリファレンスしていますね。また、$$arrref[0] や $$hashref{apple} はデリファレンスしてから添え字の要素を求めています。
実行結果は以下の通りです。

123 abc 4.56 def
123
banana apple
red

ちゃんと値が表示されています。(^_^)
この構文を利用すれば2次元配列なども簡単に作る事ができます。

# ref4.pl
 
my $arrtable = [
	[ "0-0", "1-0", "2-0" ],
	[ "0-1", "1-1", "2-1" ],
	[ "0-2", "1-2", "2-2" ],
];
my $hashtable = {
	apple => { flavor => "sweet", color => "red" },
	lemon => { flavor => "sour", color => "yellow" },
	grape => { flavor => "sweet", color => "purple" }
};
 
print "@{$$arrtable[1]}\n";
print "${$$arrtable[2]}[0]\n";
print join " ", keys(%$hashtable), "\n";
print "${$$hashtable{lemon}}{flavor}\n";

……(^_^;) すごい複雑です。もう書いていてわけがわからなくなりました。これは悪い例ですね。
$arrtable と $hashtable はそれぞれ2次元の配列とハッシュへのリファレンス作っているのはわかると思います。
問題は表示する部分ですが……デリファレンスと添え字とが入り混じって混沌としています。何がなんだかわかりません。
そこで、Perl には配列やハッシュへのデリファレンスの為の簡潔な構文が存在します。リファレンスと添え字の間に "->" (矢印演算子)を置くと、なんと自動的にデリファレンスしてくれるのです。しかも、わざわざ頭に記号を付ける必要がありません。
上のコードを書き直してみると……

# ref4.pl
 
my $arrtable = [
	[ "0-0", "1-0", "2-0" ],
	[ "0-1", "1-1", "2-1" ],
	[ "0-2", "1-2", "2-2" ],
];
my $hashtable = {
	apple => { flavor => "sweet", color => "red" },
	lemon => { flavor => "sour", color => "yellow" },
	grape => { flavor => "sweet", color => "purple" }
};
 
print "@{$arrtable->[1]}\n";
print "$arrtable->[2][0]\n";  # 添え字と添え字の間の矢印は省略可能
print join " ", keys(%$hashtable), "\n";
print "$hashtable->{lemon}{flavor}\n";

明らかにこちらの方が読みやすいですね。(^_^;)
添え字と添え字の間の矢印演算子は省略できるので、C言語の2次元配列のように [2][0] のように書けます。
以下が実行結果です。

0-1 1-1 2-1
0-2
lemon apple grape
sour

これで、色々なデータ構造を使えるようになりましたね。(^_^)