|
|
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関数を使用して、ひとつずつ処理しましょう。 |