Perlでは、ハッシュを使用して構造体のようなデータ構造を持つことができます。たとえば、C言語において以下のように宣言される構造体です。
struct Person{
char name[n];
int age;
};
本記事では、ハッシュを使ったデータ構造の表現についてサンプルコードを紹介します。
サンプルコード
複数の人物の名前と年齢のリストを年齢層に基づいてグループ化する処理のサンプルです。
use strict;
use warnings;
# 人物のリスト(名前と年齢)
my @people = (
{ name => 'Alice', age => 25 },
{ name => 'Bob', age => 30 },
{ name => 'Carol', age => 22 },
{ name => 'David', age => 35 },
{ name => 'Eve', age => 18 },
);
# 年齢に基づいて人物をグループ化するハッシュ
my %groups;
foreach my $person (@people) {
if ($person->{age} < 20) {
push @{$groups{'20歳未満'}}, $person->{name};
} elsif ($person->{age} >= 20 && $person->{age} <= 29) {
push @{$groups{'20歳から29歳'}}, $person->{name};
} else {
push @{$groups{'30歳以上'}}, $person->{name};
}
}
# 結果を表示
foreach my $group (keys %groups) {
print "$group: " . join(', ', @{$groups{$group}}) . "\n";
}
実行結果
30歳以上: Bob, David
20歳未満: Eve
20歳から29歳: Alice, Carol
@people について
構造体変数の配列を表している部分です。
# 人物のリスト(名前と年齢)
my @people = (
{ name => 'Alice', age => 25 },
{ name => 'Bob', age => 30 },
{ name => 'Carol', age => 22 },
{ name => 'David', age => 35 },
{ name => 'Eve', age => 18 },
);
この処理は、以下のように置き換えると分かりやすくなります。
# 5人分のハッシュを作成(名前と年齢)
my %ALICE = ( name => 'Alice', age => 25 );
my %BOB = ( name => 'Bob', age => 30 );
my %CAROL = ( name => 'Carol', age => 22 );
my %DAVID = ( name => 'David', age => 35 );
my %EVE = ( name => 'Eve', age => 18 );
# 人物のリストとして5人分のハッシュリファレンスを登録
my @people = (
\%ALICE,
\%BOB,
\%CAROL,
\%DAVID,
\%EVE,
);
人物のデータへのアクセス方法
配列の要素(=ひとつのハッシュ)はハッシュリファレンス(ハッシュの参照)です。ハッシュリファレンスを通じてデータにアクセスするには、デリファレンスが必要です
$person->{name}
C言語に馴染みのある方なら、ハッシュリファレンスとデリファレンスの関係は、構造体ポインタとアロー演算子だと考えていただくと分かりやすいかと思います。
my $person = $people[0]; # 一人目のデータを選択
print "$person->{name}\n";
print "$person->{age}\n";
まとめ
本記事では、ハッシュを使ったデータ構造の表現について紹介しました。今回紹介したサンプルコードは名前と年齢のシンプルなデータ構造でしたが、これを理解しておけば複雑なデータ構造にも応用できると思います。