Perlで覚えたいデータ構造 - 配列・ハッシュ

Perlを使う場合に必ず必要になるデータ構造、配列とハッシュの使い方の覚書きです。

配列

配列は複数件のデータを扱うためのデータ構造です。

■配列を生成する。

配列の生成は以下のように行います。

my @配列の名前 = ();
my @配列の名前 = ( データ, データ, … );

配列の生成では、配列の名前を指定します。
もし、生成時にデータを格納する場合に、()内にデータを指定します。
なお、Perlでは配列の生成時にサイズを指定しません。


例えば、空の配列array1を生成するには、以下のように書きます。

my @array1 = ();

もう一つ例を挙げます。データを3つ格納した配列array2を生成するには、以下のように書きます。

my @array2 = ( "people", "dogs", "cats" );
■配列にデータを追加する。

配列へのデータの追加は以下のように行います。

push @配列の名前, データ;

データの追加では、配列の名前とデータを指定します。
追加するたびに、データは配列の末尾に追加され、配列のサイズが増えます。


例えば、配列array1にデータを追加するには、以下のように書きます。

push @array1, "green";
push @array1, "blue";
push @array1, "red";
■配列にデータを格納する。

配列の特定の位置へのデータの格納は以下のように行います。

@配列の名前[インデックス] = データ;

特定の位置へのデータの格納では、配列の名前とインデックスと格納するデータを指定します。
インデックスとは配列の位置を表す数字で、「0」以上で「配列のサイズ」より小さい値を指定する必要があります。


例えば、配列array2へのデータを格納するには、以下のように書きます。

@array2[2] = "rabbits";
■配列からデータを取得する。

配列からのデータの取得は以下のように行います。

ビルトイン関数 $配列の名前[インデックス];
サブルーチン( $配列の名前[インデックス] );
$変数 = $配列の名前[インデックス];
return $配列の名前[インデックス];

データの取得では、配列の名前とインデックスを指定します。インデックスの考え方はデータの格納時と同様です。
配列から取得したデータは、ビルトイン関数やサブルーチンの引数に渡したり、変数に代入したり、メソッドの戻り値として返したりできます。


例えば、配列array1のデータを取得して画面に表示するには、以下のように書きます。

print $array1[0]."\n"; => green
print $array1[1]."\n"; => blue
print $array1[2]."\n"; => red
■配列中のすべてのデータに同じ処理をする。

配列中のすべてのデータに同じ処理をするためには、以下のようなfor文を使用します。

for ( my $i = 0; $i < @配列の名前; ++$i ) {
        // $配列の名前[$i] を使用した処理
}

このfor文中の『@配列の名前』は配列のサイズを表します。そのため、このfor文を使えば配列中のすべてのデータに同じ処理を行えます。


例えば、配列array2中のすべてのデータを表示するには、以下のように書きます。

for ( my $i = 0; $i < @array2; ++$i ) {
        print $array2[$i]."\n";
}

これは以下のように書いた場合と同じ結果になります。

print $array2[0]."\n"; => people
print $array2[1]."\n"; => dogs
print $array2[2]."\n"; => rabbits

ハッシュ

ハッシュとは、キーに関連付けてデータを格納するデータ構造です。

■ハッシュを生成する。

ハッシュの生成は以下のように行います。

my %ハッシュの名前 = ();
my %ハッシュの名前 = ( キー => データ, キー => データ, … );

ハッシュの生成では、ハッシュの名前を指定します。
もし、生成時にデータを格納する場合、()内にキーとデータを指定します。データはキーに関連付けて格納されます。


例えば、空のハッシュhash1を生成するには、以下のように書きます。

my %hash1 = ();


もう一つ例を挙げます。データを3つ格納したハッシュhash2を生成するには、以下のように書きます。

my %hash2 = ( "name" => "nattou_curry", "age" => "26", "height" => "169" );
■ハッシュにデータを格納する。

ハッシュへのデータの格納は以下のように行います。

$ハッシュの名前{キー} = データ;

データの格納では、ハッシュの名前とキーと格納するデータを指定します。データはキーに関連付けて格納されます。


例えば、ハッシュhash1にデータを格納するには、以下のように書きます。

$hash1{"Sun"} = "日曜日";
$hash1{"Mon"} = "月曜日";
$hash1{"Tue"} = "火曜日";
$hash1{"Wed"} = "水曜日";
■ハッシュからデータを取得する。

ハッシュからのデータの取得は以下のように行います。

ビルトイン関数 $ハッシュの名前{キー};
サブルーチン( $ハッシュの名前{キー} );
$変数 = $ハッシュの名前{キー};
return $ハッシュの名前{キー};

ハッシュからのデータの取得では、ハッシュの名前とキーを指定します。キーに関連付いたデータが取得されます。
ハッシュから取得したデータは、ビルトイン関数やサブルーチンの引数に渡したり、変数に代入したり、メソッドの戻り値として返したりできます。


例えば、ハッシュhash2からデータを取得して表示するには、以下のように書きます。

print $hash2{"name"}."\n"; => nattou_curry
print $hash2{"height"}."\n"; => 169
print $hash2{"age"}."\n"; => 26
■ハッシュ中のすべてのデータに同じ処理をする。

ハッシュ中のすべてのデータに同じ処理をするためには、以下のようなforeach文を使用します。

foreach my $key ( keys %ハッシュの名前 ) {
        my $data = $hash2{$key};

        // $dataや$keyを使用した処理
}

このforeach文では、すべてのキーとデータについて処理を繰り返します。繰り返すたびに、変数$keyにはキーが、変数$dataにはデータに格納されます。


例えば、ハッシュhash1中のすべてのキーとデータの関連付けを表示するには、以下のように書きます。

foreach my $key ( keys %hash1 ) {
        my $data = $hash1{$key};

        print "$key: $data\n";
}

これは、以下のように書いた場合と同じような結果になります。ただし、キーの順序は決まっていないので、表示順序は異なることがあります。

print "Mon: ".$hash1{"Mon"}."\n"; => Mon: 月曜日
print "Tue: ".$hash1{"Tue"}."\n"; => Tue: 火曜日
print "Wed: ".$hash1{"Wed"}."\n"; => Wed: 水曜日
print "Sun: ".$hash1{"Sun"}."\n"; => Sun: 日曜日