Hash.
ハッシュ(1999/11/25)
聞き慣れない言葉かもしれませんが今回はハッシュを使ってみましょうか。ハッシュは連想配列(associated array)とも呼ばれ、配列と多少似ている所があります。通常の配列と決定的に異なるのは添え字が数値ではなく文字列であるという点です。配列の場合は添え字を[ ]で括りますがハッシュの場合は{ }で括ります。また特定要素を示さない場合、配列では@を頭に付けますがハッシュの場合は%を頭に付けます。つまり@abcは配列abcですが%abcはハッシュabcです。
例として以下のようにデータをファイル中に持っているプログラムがあったとします。
$/ = "\n";
open( DATA, 'data' );
@data = <DATA>;
close( DATA );print "name:", $data[ 0 ], "\n";
print "age:", $data[ 1 ], "\n";
print "country:", $data[ 2 ], "\n";
ファイル'data'には名前、年齢、国の3行から成るデータが格納されています。それを配列@dataに読み込んでいます。従って@dataは3つの要素を持つ配列となります。ファイルの内容が'Thrasher'、29、'Japan'の3行から成っていたとすれば、$data[ 0 ]は'Thrasher'、$data[ 1 ]は29、$data[ 2 ]は'Japan'になります。ここでファイルの内容が'Thrasher'、29、12345、'Japan'というように新たに郵便番号を持つことになったとします。郵便番号は年齢と国の間に入っています。つまりファイルリード後の配列@dataの添え字2は国ではなく郵便番号、そして添え字3が国となる場合です。表示する箇所を以下のように変更する必要が出てきます。
print "zip:", $data[ 2 ], "\n";
print "country:", $data[ 3 ], "\n";
こんな感じでしょうか。データの項目が少ないうちは大した変更ではありませんが項目数が多いとあちこち変更が出てしまい手間になってしまいます。このような変更の手間を省けるようなコーディング方法が欲しいところです。そこで配列の代わりにハッシュを使うことにします。プログラムを以下のように書き換えます。
$/ = "\n";
open( DATA, 'data' );
$data{ 'name' } = <DATA>;
$data{ 'age' } = <DATA>;
$data{ 'country' } = <DATA>;
close( DATA );print "name:", $data{ 'name' }, "\n";
print "age:", $data{ 'age' }, "\n";
print "country:", $data{ 'country' }, "\n";
プログラムの冒頭で早速ハッシュが登場しています。配列とは異なり添え字は[ ]ではなく{ }で括ります。またハッシュの場合は添え字は数値ではなく文字列です。さてハッシュを用いることの利点はもうお判りになりましたでしょうか? これに新たに郵便番号の項目を増やしてみて下さい。郵便番号は年齢の次です。おそらく以下のようになることでしょう。
$/ = "\n";
open( DATA, 'data' );
$data{ 'name' } = <DATA>;
$data{ 'age' } = <DATA>;
$data{ 'zip' } = <DATA>;
$data{ 'country' } = <DATA>;
close( DATA );print "name:", $data{ 'name' }, "\n";
print "age:", $data{ 'age' }, "\n";
print "zip:", $data{ 'zip' }, "\n";
print "country:", $data{ 'country' }, "\n";
ハッシュを用いた場合は増えた項目の分だけ添え字をずらすといった変更は不要になります。つまり配列の場合は添え字が数値なので暗黙のうちに配列内の項目順をプログラムを書く人が考慮せざるを得なくなりますが、ハッシュの場合は文字列なので項目の順序という概念そのものがなくなります。