|
|
|
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の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に入ることになっているので、上記のようなやり方をすれば 簡単に全ての連想配列の値とキーが取得できるわけです。 ここで使ったeachとkeysは似通っていますが、ちょっと違います eachは連想配列からキーと値の「2要素」の値を取り出して、その2要素を変数値として返す。 keysは連想配列から、全てのキーをリストとして配列で返す。 valuesは連想配列から、全ての値をリストとして配列で返す。 keysやvaluesは値が全て詰まった配列を生成する処理になるため、 巨大な配列が出来てしまう可能性があるかないか、検討した上で使ってください。 (あまりに大きい場合メモリを使い果たしてしまうかもしれません) そういった場合には、each関数を使用して、ひとつずつ処理しましょう。 | |||||||||||