買い物かご 掲示板 メール DB 利用規定 FAQ サポートBBS


次(サブルーチン1)
前(配列)
必要なツール
最低限必要な知識
Make CGI Top
Basic

Home



連想配列 --最低限必要な知識--


連想配列(ハッシュ)

今回は連想配列です。ハッシュとも言います。おなじみ「Perl Editor」を用意して

# 初期設定を貼りつける

%jusyo = (

'太郎','東京都',
'次郎','大阪府',
'花子','京都府',
'さちこ','長野県',
'幸一','神奈川県',

);

print "Content-type: text/html\n\n";
print "<html><head><title>$main_title</title></head>\n";
print "$body\n";
print "住所録<p>\n";

while ( ($key,$val) = each %jusyo) {

print "$keyの住所は$valです。<br>\n";

}

print "</body></html>\n";

以上のソースをコピーしてブラウザで表示してみましょう。

住所録

太郎の住所は東京都です。
さちこの住所は長野県です。
幸一の住所は神奈川県です。
花子の住所は京都府です。
次郎の住所は大阪府です。

と表示されたら成功です。

%jusyoに名前と住所をどんどん追加していくだけで自動的に住所録を作ってくれます。テーブルを使って、きれいに整形してもいいでしょう。


配列が、一次元(色なら色のリストを作成する)であるのに対し、連想配列は同時に名前と住所のように、二つの要素をセットで代入することができます。

もちろん、二つ以上のリストを使う配列も可能ですが、処理や呼び出しが結構面倒なので、今回は説明しません。

サンプルソースを解析してみましょう。

%jusyo = (

'太郎','東京都',
'次郎','大阪府',
'花子','京都府',
'さちこ','長野県',
'幸一','神奈川県',

);

  • 「%jusyo」の%は、「これは連想配列だぞぉ」とPerlに教えるための記号です。
  • %の後ろの文字列は、連想配列の名前です。
  • =('中身1','中身1','中身2','中身2')のように、ペアーになる要素を,(カンマ)で区切ります。ペアーとペアーの間も,(カンマ)で区切ります。ここではペアーとペアーが区別しやすいように、改行しています。

今回は、「while」構文と「each」構文を使っています。


%jusyo = (

'太郎','東京都',
'次郎','大阪府',
'花子','京都府',
'さちこ','長野県',
'幸一','神奈川県',

);

# 中略・・・・

while ( ($key,$val) = each %jusyo) {

print "$keyの住所は$valです。<br>\n";

}

「each」構文を使って、連想配列のペアーを二つに分解して別々の変数に代入することができます。

%jusyoに入っている「太郎 東京都」で、「変数$keyに太郎」「変数$valに東京都」をそれぞれ代入しています。

しかし、連想配列の要素は一つだけではありません。次郎も、花子も、さちこも、幸一もいます。そこで、「while」構文を使います。

while構文は、要素(太郎、次郎など)がある限り、「{」「}」で囲まれた処理を繰り返す命令です。

%jusyoには、太郎、次郎など合計5個のペアーがありますね。ですから、while構文を使って、全部のペアーが終わるまで、ひたすら

xxxの住所はyyyです。
をHTMLファイルに出力(書き出す)しつづけます。

この処理によって、

変数$keyには「太郎」「次郎」「花子」「さちこ」「幸一」が、
変数$valには「東京都」「大阪府」「京都府」「長野県」「神奈川県」が

代入され、print "$keyの住所は$valです。<br>\n";

によって、

太郎の住所は東京都です。
次郎の住所は大阪府です。
花子の住所は京都府です。
さちこの住所は長野県です。
幸一の住所は神奈川県です。

が連続して出力されるのです。別に「$key」「$val」である必要はありません。
「$pogi」「$pagi」でも、「$pugi」「$pegi」でもかまいません。

10組いれば10回、1000組いれば1000回、同じ処理をひたすら続けます。

要素がなくなったら終了して、次の命令(ここでは</body></html>を出力する)に進みます。


今度は、上のスクリプトを改造して、あらかじめ登録した名前を選ぶと、その人のメールアドレスを表示するようにします。

作成するファイルは二つ。一つは検索用のHTMLファイル。もうひとつは、表示用のCGIスクリプトです。

■検索用フォーム「form.html」

<html>
<head><title>メール検索</title></head>
<body>

<form method=POST action=search.cgi>
<select name=username>
<option value=太郎>太郎</option>
<option value=次郎>次郎</option>
<option value=花子>花子</option>
<option value=幸一>幸一</option>
</select>
<input type=submit value=送信>
</form>
</body></html>

■表示用CGIスクリプト「search.cgi」

# 初期設定を貼りつける

%email = (

'太郎','taro@xxx.co.jp',
'次郎','jiro@xxx.co.jp',
'花子','hanako@xxx.co.jp',
'さちこ','hanako@xxx.co.jp',
'幸一','koichi@xxx.co.jp',

);

print "Content-type: text/html\n\n";
print "<html><head><title>$main_title</title></head>\n";
print "$body\n";
print "メールアドレス<p>\n";

while ( ($key,$val) = each %email) {

  if ( $FORM{'username'} eq $key ) {

  print <<"EOF";

  $FORM{'username'}のメールアドレスは
  <a href=mailto:$email{$key}>$email{$key}</a>です。

EOF
  }

}

print "</body></html>\n";


ここでは,「while」「each」に続いて「if」構文も登場しています。なんだか頭が混乱してくるでしょう?

実際にスクリプトを改造したり作成するときは、一つの構文を覚えただけでは役に立たないことが多いですね。いくつかの構文を組合せて利用することがほとんどです。

意味がわからず混乱しそうなときは、迷わず「覚えてしまいましょう!


一つ目では、全部の要素を表示させました。
ここでは、いくつかの要素から一つだけ選択させる処理が含まれています。

まず、「form.html」から・・・

<form method=POST action=search.cgi>
<select name=username>
<option value=太郎>太郎</option>
<option value=次郎>次郎</option>
<option value=花子>花子</option>
<option value=幸一>幸一</option>
</select>
<input type=submit value=送信>
</form>

赤字の部分に注目!

「search.cgi」は言うまでもないですね。データの送り先のCGIスクリプトを指定しています。

では、「name=username」「value=名前」は、search.cgiのどこに送られるのでしょうか?

while ( ($key,$val) = each %email) {

  if ( $FORM{'username'} eq $key ) {

  print <<"EOF";

  $FORM{'username'}のメールアドレスは
  <a href=mailto:$email{$key}>$email{$key}</a>です。

EOF
  }

}

そう、上のソースの赤字部分に送られています。

whileとeachはさっき学びました。$FORM{'xxx'}の意味は、「送信データの表示」で説明しましたね。忘れた人はもう一度復習しましょう。

ここではさらに、if構文が登場しています。

if構文は、エクセルの関数なんかを勉強したことがある人なら、すぐにピンと来るでしょうね。意味は基本的にエクセルのif関数なんかと同じです。

 if ( $FORM{'username'} eq $key ) { ・・・・ }

は「form.html」から送られた来たフォームオプション(ここではemailを表示させたい人の名前)のname属性(ここでは、name=username)が、変数$key(ここでは「太郎」「次郎」「花子」「さちこ」「幸一」)と同じ(eqは「=」のことだと覚えてください)だったら、メールアドレスを表示させます。

一つ一つ見ていき、違っていたら、処理をやりなおし、同じなら表示し、違っていたら処理をやりなおし・・・をペアーの数分繰り返します。

ちなみに、このスクリプトでは、同じ名前の人が二人いれば二人分のメールアドレスを表示します。

全ての処理が終わったら、</body></html>を出力して、HTMLを表示し終え、スクリプトが終了します。


一見簡単そうな処理でも、3つの構文を組合せているんですね。

CGIに限らず、プログラムを組むには、日ごろの私たちの思考方法とはまったく異なった思考方法を学ぶ必要があります。

物事をできるだけ細かく分解して、これ以上細かくできなくなったら、使えそうな構文やら関数やらを探して当てはめていきます。

でも、始めからできる人はほとんどいません。最後に役立つのは経験です。

始めから、あれも、これもと欲張らずに、わかったところから試していきましょう。

if構文を使えるようになったら、if構文だけを使って、スクリプトを改造してみましょう。やがて、if構文だけではにっちもさっちも行かなくなります。そうしたら、whileやらforeachやら、for(まだ勉強してませんね)やらを覚えていきます。

私はこうして、CGIを覚えました。

あと、リファレンス集は常に手元において置きましょう。構文やら関数の例題が豊富に出ているのがベストですね。暇なときは、ぱらぱらめくってみます。(眠れないときとか・・・)

ふと・・・

「あっ!これはあれで使えるかも!」なんて瞬間が必ずあります。
そうなったらしめたもの!
実際に役立つ役立たないはこの際関係ありません。
使える!と思ったことが大切です。

この間買ったPerl本に、「連想配列」ではなく「ハッシュ」というのが正しいと書かれていました。どっちも同じことなんですけど、本職のプログラマにとっては、用語一つ取っても「こだわる」ことが大切なんでしょうね。

あなたも、本職のプログラマと会話するときは、「連想配列」ではなく「ハッシュ」と言ったほうがいいのかも・・・。


Web寺子屋 OGIPOGI E-mail:info@web-terakoya.net
Copyright© 2000-2001 OGIPOGI All Rights Reserved.