Perlでのハッシュのハッシュ
今回は予想通り『ハッシュのハッシュ』です。
ハッシュのハッシュを作成
%a = ('A' => { 'AA'=>'aa', 'AB'=>'ab', 'AC'=>'ac' }, 'B' => { 'AA'=>'ba', 'AB'=>'bb', 'AC'=>'bc' }, 'C' => { 'AA'=>'ca', 'AB'=>'cb', 'AC'=>'cc' });
- 'AA'=>'aa', 'AB'=>'ab', 'AC'=>'ac' は、'AA','aa','AB','ab','AC','ac' とイコールです。
- { 'AA'=>'aa', 'AB'=>'ab', 'AC'=>'ac' } のようにリストを中括弧すると無名ハッシュへのリファレンスとして表現されます。
- %aは、キー値とそのリファレンスが格納されているハッシュになります。
- つまり、ハッシュ%aのキー値と対になっている各要素のリファレンスは、無名ハッシュを指しているので、ハッシュのハッシュになります。
ハッシュのハッシュを取り出す
foreach $i (sort keys %a) { foreach $j (sort keys %{$a{$i}}) { print '$a{' . $i . '}{' . $j . '}=' . $a{$i}{$j} . ' '; } print "\n"; }
- sort keysは、ハッシュ内をキー値でソートしています。
- %{$a{$i}}の$a{$i}は、無名ハッシュのリファレンスが格納されています。
- %{$a{$i}}は、無名ハッシュのデリファレンスです。
サンプルソース
foreach $i (sort keys %a) { foreach $j (sort keys %{$a{$i}}) { print '${$a{' . $i . '}}{' . $j . '}=' . ${$a{$i}}{$j} . ' '; } print "\n"; foreach $j (sort keys %{$a{$i}}) { print '$a{' . $i . '}->{' . $j . '}=' . $a{$i}->{$j} . ' '; } print "\n"; foreach $j (sort keys %{$a{$i}}) { print '$a{' . $i . '}{' . $j . '}=' . $a{$i}{$j} . ' '; } print "\n\n"; }
処理結果
${$a{A}}{AA}=aa ${$a{A}}{AB}=ab ${$a{A}}{AC}=ac $a{A}->{AA}=aa $a{A}->{AB}=ab $a{A}->{AC}=ac $a{A}{AA}=aa $a{A}{AB}=ab $a{A}{AC}=ac ${$a{B}}{AA}=ba ${$a{B}}{AB}=bb ${$a{B}}{AC}=bc $a{B}->{AA}=ba $a{B}->{AB}=bb $a{B}->{AC}=bc $a{B}{AA}=ba $a{B}{AB}=bb $a{B}{AC}=bc ${$a{C}}{AA}=ca ${$a{C}}{AB}=cb ${$a{C}}{AC}=cc $a{C}->{AA}=ca $a{C}->{AB}=cb $a{C}->{AC}=cc $a{C}{AA}=ca $a{C}{AB}=cb $a{C}{AC}=cc