5. ハッシュ配列について
今日は、ハッシュ配列について詳しくご説明いたします。
■ハッシュとは
ハッシュとは簡単に言ってしまうと、文字列を添字とする配列です。
通常の配列
$a[0]
$a[1]
の数字の部分が文字列のキーとなります。
$a{'name'}
$a{'email'}
ハッシュ配列を使用すると、簡易的なデータベースとして扱うこともできます。
$a[0]に名前、$a[1]にメールアドレスが入っているとするより、$a{'name'}に名前、
$a{'email'}にメールアドレスが入っているとした方が分かりやすいですね。
ハッシュ配列は、%を使用して@の配列と区別されます。例えば、
%hash
@hash
を使用している場合、
$hash[0] #配列 @hashの先頭の要素を表わす
$hash{0} #ハッシュ %hashのキー"0"に対応する要素を表わす
と区別されます。
■ハッシュへの代入
%Hash = ( "one", 1 , "two", 2 ,"three", 3 );
キー、値、キー、値の順で代入されていきます。
キー値 one two three
値 1 2 3
%Hash = ( "one" => 1 , "two" => 2 , "three" => 3 );
上のサンプルと結果は同等ですが、キー値と値の関係を明確に記述する事が出来ます。
(キー値 => 値の組で作成されます)
$Hash{'five'} = 5;
キー = "five"、値 = 5 と対応して作成されます。
%Hash = ();
空のハッシュを作成します。
■参照
次に示すサンプルハッシュを元に、ハッシュを参照するやり方を見てみます。
【サンプルハッシュ】
-----------------------------------------------------------------
%Hash = ( "one" => 1 , "two" => 2 , "three" => 3 );
print $Hash{two};
-----------------------------------------------------------------
ハッシュのキー値"two"に対応づけられた値が表示されます。
表示 → 2
-----------------------------------------------------------------
print %Hash;
-----------------------------------------------------------------
キー値、関連付けられた値の全てを出力します。ただし、その順番は保証されません。
表示 → three3two2one1
ハッシュ全ての要素に処理を行う場合は、foreachを使用して全てのキー値を出力する
ことができます。
foreach $変数 ( keys( %ハッシュ名 ) ) {
処理
}
このように記述すると、$変数に値が順番に格納されてループします。
全て参照し終わった時点でこのforeachブロックを終了します。
-----------------------------------------------------------------
foreach $key ( keys( %Hash ) ) {
print "キー値 : $key\n";
print "値 : $Hash{$key} \n";
}
-----------------------------------------------------------------
取得したキー値からデータを参照しています。
また、keysの部分をvaluesにすると、値が直接取れます。
-----------------------------------------------------------------
foreach $value ( values( %Hash ) ) {
print "値 : $value \n";
}
-----------------------------------------------------------------
while文で全てのキー値、データを出力するには、
-----------------------------------------------------------------
while ( ( $key , $value ) = each %Hash ){
print "キー値 : $key\n";
print "値 : $value \n";
}
-----------------------------------------------------------------
とします。each関数で毎回ハッシュにあるキー値とデータの組み合わせを1つずつ
取得していきます。全部参照し終わった時点で関数よりnullが返るので繰り返しを
終了します。
Perlの関数については、別の機会にまとめてご紹介します。
★今日のまとめサンプルプログラム
-----------------------------------------------------------------
#! /usr/local/bin/perl
print "Content-type:text/html\n\n";
print << "END_OF_HTML";
<HTML>
<HEAD>
<TITLE>TEST</TITLE>
</HEAD>
<BODY>
END_OF_HTML
%weekday =(
1=>'Sunday',
2=>'Monday',
3=>'Tuesday',
4=>'Wednesday',
5=>'Thursday',
6=>'Friday',
7=>'Saturday');
foreach $tmp ( values ( %weekday ) ) {
print $tmp . '<br>';
}
print "<br>12月3日は";
print $weekday{'6'};
print "です。<br>";
print << "END_OF_HTML";
</BODY>
</HTML>
END_OF_HTML
exit;
-----------------------------------------------------------------
■解説
サンプルを実行していただくと分かると思いますが、キー7の要素"Saturday"から
表示されているかと思います。
ハッシュ配列はあまり順番を意識するものではなく、キーを指定して値を取り出す
配列なので、必ずしも最初の配列から取り出せるわけではないので、注意して
ください。
★課題
1. 以下のデータをwhile文を使用してHTML中に表示してください。
%weekday =(
1=>'Sunday',
2=>'Monday',
3=>'Tuesday',
4=>'Wednesday',
5=>'Thursday',
6=>'Friday',
7=>'Saturday');
2. 以下のキーとデータをハッシュ配列に格納し、HTML中に表示してください。
name : しょう
email : searchai@zw.main.jp
address : 東京都渋谷区
tel : 090-6934-9953
★前回の課題の解答
1. 以下の 2つの配列をつなげた配列を作成してください。
@a = (1, 2, 3, 4);
@b = (5, 6, 7, 8);
→下のサンプルを参照してください。
2. 以下は、ある11人のテストの点数です。11人の合計点と平均点をHTML中に
表示するプログラムを作成してください。
75点、80点、88点、49点、69点、77点、93点、72点、81点、58点、72点
→下のサンプルを参照してください。
-----------------------------------------------------------------
#! /usr/local/bin/perl
print "Content-type:text/html\n\n";
print << "END_OF_HTML";
<HTML>
<BODY>
END_OF_HTML
# 1.の解答例
@a = (1, 2, 3, 4);
@b = (5, 6, 7, 8);
@c = (@a, @b);
print @c;
print '<br>';
# 2.の解答例
$sum = 0;
@ary = (75,80,88,49,69,77,93,72,81,58,72);
foreach (@ary) {
$sum += $_;
}
$avg = $sum / @ary;
print "合計点は $sum 点です。<br>";
print "平均点は $avg 点です。<br>";
print << "END_OF_HTML";
</BODY>
</HTML>
END_OF_HTML
exit;
-----------------------------------------------------------------
■解説
初期化の応用ですが、@aと@bの配列をつなげたい場合は
@c = (@a, @b);
とすれば、@aの後に@bをつなげた配列ができます。
テストの点数は、合計点を計算し、別の変数に平均点を格納しておくとよいかと
思います。
|