第13回 多段ハッシュ

さて、前回は多次元配列のお話でした。今回は、多段ハッシュのお話です。

配列の中に配列が入っているのは「次元」という言葉をつかって「多次元配列」と呼ばれるのですが、
ハッシュの値の中にまたハッシュが入っているのは、「段」という言葉をつかって「多段ハッシュ」と呼ばれます。

やはり、値の方には、「スカラーな値」しか持てませんので、リファレンスで頑張ります。



さて、この多段ハッシュでどんなことができるのかというと、
「A組には、中西、木村、田中」、「B組には、斉藤、山本」がいるとして、それぞれの苗字から名前を取得するということができます。

use strict;
use Data::Dumper;

my %c = (
         'A'=>{
               '中西' => 'ビンゴ',
               '木村' => '次郎',
               '田中' => '三郎'
              },
         'B'=>{
               '斉藤' => '4郎',
               '山本' => '5郎'
              }
        );

print "$c{'A'}->{'中西'}", "\n";
print "$c{'B'}->{'山本'}", "\n";

# A組だけ表示
print "\n";
print "A組", "\n";

for ( keys %{$c{'A'}} ){
 print "$_ : $c{'A'}->{$_}", "\n";
}

結果:

ビンゴ
5郎

A組
木村 : 次郎
中西 : ビンゴ
田中 : 三郎

どうでしょうか? これは、かなり強力なプログラミングテクニックです。
配列では、無味乾燥な数字(インデックス)でデータにアクセスしますが、
ハッシュなら名前を持っているのでデータを管理しやすいです(下手につけると余計に管理しづらくなりますが)。



さて、配列の [ ] と [ ]の間のデリファレンスの矢印は、省略することができました。
これ、ハッシュも同じで、 { } と { } の間のデリファレンスの矢印は省略することが可能です。



ということで先ほどのプログラムは、

use strict;
use Data::Dumper;

my %c = (
         'A'=>{
               '中西' => 'ビンゴ',
               '木村' => '次郎',
               '田中' => '三郎'
              },
         'B'=>{
               '斉藤' => '4郎',
               '山本' => '5郎'
              }
        );

print "$c{'A'}{'中西'}", "\n";   # 矢印省略
print "$c{'B'}{'山本'}", "\n";   # 矢印省略

# A組だけ表示
print "\n";
print "A組", "\n";

for ( keys %{$c{'A'}} ){
 print "$_ : $c{'A'}{$_}", "\n"; # 矢印省略
}

このようにも 書けます。

結果:

ビンゴ
5郎

A組
木村 : 次郎
中西 : ビンゴ
田中 : 三郎

それでは また〜