小池啓仁 ヒロヒト応援ブログ By はてな

小池啓仁(コイケヒロヒト)の動画など。

小池啓仁 ヒロヒト応援ブログ By はてな

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{$i}}{$j}は、$a{$i}をデリファレンスたもののそのハッシュ{$j}です。
  • したがって、${$a{$i}}{$j}は矢印演算子を使って$a{$i}->{$j}と表現できます。
  • 実は、矢印演算子を省略でき、最終的に$a{$i}{$j}で表現できるのです。

処理結果

${$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