Study 3 配列

配列とは複数のデータを格納する変数です。
スカラ変数は一つしか格納できない変数ですが、
配列は無限(論理的に)にデータを格納する事が出来ます。

スカラ変数は頭に「$」を付けますが、配列は頭に「@」を付けます。
PerlではC言語やJAVAと違い、始めに何個格納できるかという宣言をしなくていいという特性があります。特性といってもその分メモリ領域の量が増えるので一長一短ですが。

例文を見てみましょう。

$a = 1;
@a = (1,2,3,4);

上がスカラ変数、下が配列変数です。
@aという配列に1〜4までの数値を代入しています。
$aと@aは名前は同じですが、全く別の変数として解釈されます。
これを表示させてみましょう。

print @a;

結果は以下の通りです。

1234

単に@aの中身が順番に表示されています。
では次の場合はどうでしょう。

@a = (1,2,3,4);
$a = @a;
print $a;

2行目でスカラ変数$aに@aの値を代入しています。
結果は以下の通りです。

4

@aをそのまま表示させると「1234」と表示されましたが、$aだと「4」が表示されます。
これはどういう事でしょうか?
もしこれが以下の場合だったら結果は「1234」と表示されます。

@a = (1,2,3,4);
@b = @a;
print @b;

一つの配列の情報を別の配列変数にコピーしているだけです。
ですがコピーする先が配列変数で無くスカラ変数だった場合は
配列そのものでは無く配列の個数が代入されます。
つまり@aには(1、2、3、4)という四つのデータが入っていますよという意味です。

次にこの配列の値を個別に表示させてみましょう。
一個目のデータを表示させる方法は以下の通りです。

@a = ('りんご','みかん','バナナ','いちご');
print $a[0];

$a[0]という表記に注目して下さい。
$a[0]は@aの1つ目のデータを表します。
$マークが頭に付くと配列ではなくスカラとして判断されます。
$a[0]は一個のデータしか格納出来ないスカラ変数扱いなので$マークが付きます。
$aの横にある[0]は要素番号と呼ばれるものです。
要するに何番目のデータかという事ですが、リストの最初のデータにアクセスする場合は、 1ではなく0だという事に注意して下さい。配列は必ず0から始まるのです。
先ほどの例文の結果は以下の通りです。

りんご

データのアクセスは何も一つとは限りません。

print $a[0,1];

一遍に二つのデータ(一つ目とニつ目)にアクセスしています
これは三つでも四つでも要素番号をカンマで区切る事で出来ます。
結果は以下のようになります。

りんごみかん

また以下のようにある要素番号からある要素番号までという記述方法もあります。

print $a[1 .. 3];

日本語で言うと@aというデータ群の中の二番目から四番目(0が一番目なので)のデータです。
結果は以下の通りです。

みかんバナナいちご

無論、要素番号は数値だけでなく数値の入った変数でも構いません。

$x = 1;
print $a[$x];

結果:みかん

数値や変数だけでなく数式を入れることも可能です。

$x = 1;
print $a[$x - 1];

結果:りんご

要は結果的に要素番号になれば良いわけです。

要素番号が整数で無い場合は自動的に整数部分だけを認識します。

print $a[1.000123548];

結果:みかん

プログラム中に一つの配列に何個のデータが入っているか分からない場合があります。
例えば社員の名前が入った@shainという配列があるとします。

@shain = ('田中','高橋','清水','鈴木','北村','林');

最初の社員数は全員で6人です。 ですがこの後に高橋が結婚退職して北村がヘッドハンティングされ、その後に村田と松田が新入社員として入社、これが毎年色々な形で変動した場合、最終的な人数はわかりません。

一番最後に入った社員の名前を@shainから取り出したいのですが要素番号が不明です。
その場合は以下のようにします。

$a = $#shain;
$b = @shain;
print "一番最後に入社した社員は$shain[$a]さんです。";
print "社員は全員で$b人です。";

結果:一番最後に入社した社員は伊集院さんです。社員は全員で13人です。

配列の前に$#を付けるとその配列の最後の要素番号が分かります。
$aには@shainの1番最後の要素番号が格納されます。
$bの場合、先ほども述べましたがその配列が何個あるのかという数値が代入されます。
考えればすぐ分かる事ですが、最終要素番号は常に配列個数より1少ない数です。
ですので以下のようにやっても同じ名前が表示されます。

$b = @shain;
$a = $b - 1;
print "一番最後に入社した社員は$shain[$a]さんです。";
print "社員は全員で$b人です。";

結果:一番最後に入社した社員は伊集院さんです。社員は全員で13人です。

study3戻る


Copyright 2000-2003 Missing Link All Rights Reserved.