ぱかぽこお馬さんPumpkinNet
 わいわいコミュニケーションネットワーク 
PumpkinNet CGI工房へようこそ。
Perl基礎講座(5)


CGI工房ホーム
スクリプト講座ホーム
CGIってなに?

(Introduction)
Perlをゲットしよう!
基礎講座(1)
変数の扱い
基礎講座(2)
制御構造文 if
基礎講座(3)
変数の複数形(1)
基礎講座(4)
ループの処理
基礎講座(5)
変数の複数形(2)
Perl基礎講座(5)
変数の複数形(2) -【連想】配列について-

基礎講座(3)にて、配列(array)について解説しました。

配列(arrayと言います)というのは、いくつかの要素を持つ変数、です。
変数[index]によって、その1つの変数として値を参照することができます。

でした。
では【連想】配列とはいったいどのようなものでしょうか?

連想ゲームはご存知だと思います。バナナといえば黄色、黄色といえば...というように
連想していきますね。

通常の配列は10行目なら[9](頭は0から始まるため)として取り出しました。
連想配列はそのように数字で指定するのではなく、「文字列」を使って値の参照、
値の代入等を行うことができるものです。

※メモ:$[を使うことにより、配列のベースとなる位置を変更できますが、
使うことはお勧めできません。配列の頭は0から始まるもの、として覚えてください。

では、さっそく連想配列を作成してみましょう。

%home =("NAME","なまえ","EMAIL","EmailAddress","URL","http://nantoka.nantoka/");
もしくは
%home=(
	"NAME" => "なまえ",
	"EMAIL" => "EmailAddress",
	"URL" => "http://nantoka.nantoka/",
);
といった形で作成します。

今生成した内容を表にするとこういう風になります。
連想配列%homeの内容
Key(値のキー)value(値)
NAMEなまえ
EMAILEmailAddress
URLhttp://nantoka.nantoka/

さて、
配列@homeの1つの要素を見るには、$home[index]という風に指定する。でした、
連想配列%homeの1つの要素を見るには、$home{Key}という風に指定します。
NAMEというkeyを持つ値を取り出すには
$home{'NAME'}
と指定します。

この「キー」を使えば、一番最初に連想配列を定義したものも、
こんな風に定義することができるようになります。
$home{'NAME'} = "なまえ";
$home{'EMAIL'} = "EmailAddress";
$home{'URL'}="http://nantoka.nantoka/";
取り出すための連想キーを持った、変数。といえばいいのでしょうか。
何かと便利ですので使う用途が広いです。CGI中のフォームデコードでは殆どの場合連想配列を使っています。
ですので、ここまでは必ず押さえておいてください。

さて、後は取り出し方ですね。

kiso_5_1.pl

%home=(
	"NAME" => "なまえ",
	"EMAIL" => "EmailAddress",
	"URL" => "http://nantoka.nantoka/",
);

foreach $i (%home) {
	print "$i\n";
}
さあ、実行結果はいかに?


キーも、値も全てが出力されてしまいますね。
しかも「取り出した順番が入れた順番とは全然違います」ね。
取り出したい順番を、データを入れる順番と一致させる方法は次回以降で紹介するとして、
キーと、値で取り出すには以下のようにします。

kiso_5_2.pl

%home=(
	"NAME" => "なまえ",
	"EMAIL" => "EmailAddress",
	"URL" => "http://nantoka.nantoka/"
);

while (($key,$value) = each %home) {
	print "$key->$value\n";
}

print "while End\n";

foreach $key (keys %home){
	print "$key -> $home{$key}\n";
}

さあ、実行結果はいかに?


キーと値が分離できましたね。
環境変数取得CGIでも同様の処理を行っています。Webサーバの環境変数が
PerlCGI上の連想配列%ENVに入ることになっているので、上記のようなやり方をすれば
簡単に全ての連想配列の値とキーが取得できるわけです。

ここで使ったeachkeysは似通っていますが、ちょっと違います

eachは連想配列からキーと値の「2要素」の値を取り出して、その2要素を変数値として返す。
keysは連想配列から、全てのキーをリストとして配列で返す。
valuesは連想配列から、全ての値をリストとして配列で返す。

keysやvaluesは値が全て詰まった配列を生成する処理になるため、
巨大な配列が出来てしまう可能性があるかないか、検討した上で使ってください。
(あまりに大きい場合メモリを使い果たしてしまうかもしれません)
そういった場合には、each関数を使用して、ひとつずつ処理しましょう。




CGI工房 ホーム  更新履歴  掲示板系  チャット系  メール系  その他スクリプト  スクリプト講座  情報交換BBS
ご意見・ご要望は掲示板もしくは、メールにて:info@pumpkinnet.to

Copyright (C) 1986〜2004 Pumpkinnet All Rights Reserved
PumpkiNet-MiniBanner