Study of CGI

配列/連想配列

配列

スカラー型は1つの変数しか扱えませんが、「スカラーの配列」を用いることで複数の変数をまとめて扱うことが出来ます。

一般には単に「配列」と呼ばれています。スカラーの配列の変数名は「@」ではじまります。

配列の要素は、順序づけされていて、最初から最後まで特定の順番に並んでいます。

個々の要素にアクセスするには、「インデックス」を用います。

インデックスとは、その要素が配列の何番目かを表す数値で、「0」から始まります。つまり、一番目の要素のインデックスは「0」で10番目の要素のインデックスは「9」です。

また、配列の個々の要素はスカラー型のデータですので、配列の要素にアクセスする際には「@」ではなく「$」を用います。

なお、配列の要素数を超えて、要素にアクセスしようとした場合は、未定義値(undef)が返されます。

配列の生成とリスト

配列の中身はリストリテラル(list literal)というものになっています。リストとは、スカラーデータに順序を付けて並べたものです。

配列にデータを入力する際にはリストを用います。また、関数を利用することも出来ます。

リストの要素には、単純な数値や文字列のほかに、式を使うこともできます。式を使った場合は、リテラルが使われるたびに式が新たに評価されます。

@list=(12,10,30,15) 数字の配列。四つの要素を持つ。
@list=("東京","大阪","札幌","福岡") 文字列の配列四つの要素を持つ。
@list=($a,@b) $aの後に配列@bがつながった配列。
@bの要素数+1の要素を持つ。
@list=($a+$b,$c+1) 計算された結果の配列。
二つの要素を持つ。

また、リスト構成演算子(list constructor operator)は、2個のスカラー値の間にピリオドを2個連続しておいたもので2つの数値の間を補完して、左のスカラー値から右のスカラー値までの範囲で、1ずつ増加する値のリストを生成します。

(開始要素 .. 終了要素)

上記のように記述すると、開始要素と終了要素の間で、開始要素と終了要素に含まれる数字の簿本を1ずつ増やした配列が生成されます。

@list=(1 .. 3); (1,2,3)と同じ
@list=(0.5 .. 2.5); (0.5,1.5,2.5)と同じ
@list=(0.5 .. 2.0); (0.5,1.5)と同じ
@list=(char1 ..char4) (cha1,char2,char3,char4)と同じ

配列の長さは、自動的に設定されます。

配列要素へのアクセス

配列の各要素にアクセスする場合には、次のように配列名の後にインデックスを「[ ]」で囲んで続けます。

$配列名[インデックス]

例えば、

@list=("東京","大阪","札幌","福岡")

の場合、

@list[0]は東京、@list[1]は大阪、@list[2]は札幌、@list[3]は福岡です。

ここで、

@list[0] = "名古屋";

とすれば、 @list[0]は名古屋になります。

また、

@list[10] = "沖縄";

とすれば、@list[10]は沖縄となります。

@list[4]から@list[9]の使っていない配列要素には未定義値(undef)が代入されます。

また、配列の要素を操作する場合には、popやpushといった関数が使用できます。

代表的な配列の関数

pop(配列の末尾の要素を取り除く)

push(配列の末尾に要素を追加する)

shift(配列の先頭の要素を取り除く)

unshift(配列の先頭に要素を追加する)

splice(配列から要素を削除する)

sort(並べ替える)

reverse(逆順に並べ替える)

連想配列(ハッシュ)

「連想配列」とは、「キー」(配列の添え字)と「値」の組をセットにしたもので、、配列のインデックスに文字列を使えるようにしたものといえます。

「連想配列」は「ハッシュ」とも呼ばれ、連想配列の名前は「%」で始まります。

単純な配列では、添え字は数字の「0」整然と順序付けされていましたが、連想配列では添え字(キー)が任意の文字列であるため、順序付けされていません。

連想配列はカード型データベースのようなもので、キーにより要素を取り出したり、データを追加したりすることができます。

個々の要素にアクセスするには、キーを用います。配列と同様、連想配列の要素もスカラーデータですのでアクセスする際には%ではなく$を使います。

存在しないキーを使いアクセスしようとすると、未定義値(undef)が返されます。

連想配列の生成

連想配列を生成するには、次のように記述します。

%address = ("斉藤","東京","鈴木","大阪","田中","札幌");

このようにすると、次の3つの「キー」と「値」の組が生成されます。


キー
斉藤 東京
鈴木 大阪
田中 札幌

しかし、この記述では、キーと値の対応関係が明確ではありません。特に大量の連想配列の要素を初期化するときは混乱する可能性があります。

そのため次のような記述もできます。

%address = ("斉藤"=>"東京","鈴木"=>"大阪","田中"=>"札幌");

このように対応関係を「=>」で記述すると、連想配列の関係がわかりやすくなります。

また、連想配列を空で初期化するときには、次のように記述します。

%address = ( );

連想配列要素へのアクセス

連想配列の各要素にアクセスする場合には、次のように連想配列名の後にキーを「{ }」で囲んで続けます。

$連想配列名{"キー"}

先に作成した連想配列のキー値「田中」を使って値を取り出すには次のようにします。

$address{"田中"};

この場合、値は札幌が返されます。

しかし、値をもとにキーを取り出すことや、存在しないキーで値を取り出すことは出来ません。

存在しないキーを使って値を取り出そうとした場合、未定義値(undef)が返されます。

連想配列に新しいキーと値を追加するのには、次のようになります。

$連想配列名{"キー"} = "値";

例えば、連想配列%addressに新しいキーと値の組を追加するには、次のようになります。

$address{"遠藤"} = "仙台";

キー「遠藤」、値「船体」の要素が追加されます。

また、すでに存在している値を追加しようとすると値が上書きされます。

例えば、次のようにするとキー「田中」の要素に、値「美瑛」が上書きされます。

$address{"田中"} = "美瑛";

連想配列の値を使って演算を行うこともできます。

例えば、次のような記述も可能です。

$hash{"keys"} = $value + 10;
$hash{"keys"} += 5;

連想配列の要素の削除を行うには、delete関数を用います。

キー値と値の配列

Perlでは、連想配列の「キー」や「値」を取り出す関数が用意されています。

連想配列の「キー」を取り出すのが、keys関数、値のリストを取り出すのがvalues関数、each関数はキーと値の組を取り出すことが出来ます。

keys関数は連想配列を引数にとり、配列で受ければキーの配列を、スカラー変数で受ければキーの数すなわち連想配列の要素数を返します。

同様にvalues関数は、配列で受ければ値の配列を、スカラー変数で受ければ値の数を返します。

each関数は、スカラー変数またはスカラー変数の2つからなるリストで結果を受けます。

スカラー変数で受けた場合はキーが、リストで受けた場合はキーと値が得られます。

連想配列は、本来は順序だてられたデータではないので値を順番に処理するようなことは出来ませんが、このような関数を使い配列のようにループ処理を行うことが出来ます。


ポイント

  1. 配列の要素には番号で、連想配列はキーという関連付けた語でアクセスする。
  2. 配列のインデックスは「[ ]」で、連想配列のはキーは「{ }」でくくる。
  3. 個々の要素にはスカラー型のデータなので「$」を付けて表現する。
Scalar Data Study of CGI Operator

□新着

  • 2016/04/14
    ページ復旧
  • 2007/10/06
    Story Maker始動
  • 2007/06/13
    久々の更新
  • 2007/01/06
    logちょっとバージョンアップ
  • 2006/07/27
    ホームページのPerl 終了

□Topics

  • 2016/04/14
    サイト復旧
  • 2007/10/06
    StoryMaker始動
  • 2007/06/13
    今後にぜひご期待を!
  • 2006/06/26
    今後について
  • 2006/06/15
    環境の変化