Search A.I.
Menu
ホーム

メールマガジン ホームページプログラミングテク

Windowsテク
Javaアプレット サンプル
Java Q & A
JavaScript Q & A
Perl Q & A
Perl レッスン
PHP レッスン
PHPテク
MS-DOS コマンド集
UNIX コマンド集
SQL コマンド集
SEの基礎講座
WEBシステム開発受注します
]無料フォームメール送信サービス
リンク集
Perl レッスン

1. Perl の基礎
2. Perlの文法、条件式
3. Perlの文法、条件式 - 続き
4. 配列について
5. ハッシュ配列について
6. Perlの基礎 - 続き
7. 関数について
8. 関数について - 続き
9. 文字列操作関数
10. 配列操作関数
11. ファイル操作
12. ファイル操作 - 続き
13. パラメータの受け渡し
14. クッキーについて
15. 総合練習
16. メール送信
17. ファイルアップロード
18. パッケージの使用方法
19. MySQL
20. MySQL - 続き(1)
21. MySQL - 続き(2)
22. PostgreSQL
23. 総合練習
24. 総合練習解答



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をつなげた配列ができます。

テストの点数は、合計点を計算し、別の変数に平均点を格納しておくとよいかと
思います。




前の章へ 次の章へ


このエントリーをはてなブックマークに追加


OfficeLance

お問い合わせはこちらから