【Perl】データ構造をハッシュで表現する

Perl

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";

まとめ

本記事では、ハッシュを使ったデータ構造の表現について紹介しました。今回紹介したサンプルコードは名前と年齢のシンプルなデータ構造でしたが、これを理解しておけば複雑なデータ構造にも応用できると思います。

タイトルとURLをコピーしました