4. 配列について
今日は、配列について詳しくご説明いたします。
■配列とは
今までのレッスンで説明不要かと思いますが、念のため。
大量のデータを扱うとき、一つ一つに変数名を連番で付けて、これを扱うとなると、
大変なことになってしまうので、配列という変数の集まりを使用することが重要に
なってきます。
-----------------------------------------------------------------
配列を使用しない場合
1.【100個の変数を初期化する】
$a1 = '壱';
$a2 = '弐';
$a3 = '参';
$a4 = '四';
↓
$a100 = '壱百';
2.【100個の変数を表示させる】
print $a1;
print $a2;
print $a3;
print $a4;
↓
print $a100;
-----------------------------------------------------------------
これでは大変ですね。
そこで、配列を使用すると、
-----------------------------------------------------------------
1.【100個の変数を初期化する】
@a = ('壱','弐','参','四','伍','六','七','八','九', ・・・ '壱百');
2.【100個の変数を表示させる】
for ($i = 0; $i < $#a; $i++) {
print $a[$i];
}
-----------------------------------------------------------------
と簡潔に記述することができます。
この配列の初期化ですが、
-----------------------------------------------------------------
$a[0] = '壱';
$a[1] = '弐';
$a[2] = '参';
$a[3] = '四';
↓
$a[99] = '壱百';
-----------------------------------------------------------------
と同じ意味です。
配列の添え字は 0 番目から始まっていることに注意してください。
■配列への代入
配列のいろいろな代入のしかたをご紹介します。
@Array = ( 1 , 2 , 3 , 4 , 5 );
これは、
$Array[0] =1;
↓
$Array[4] =5;
といった具合に先頭から順番に格納されます。
@Array = ( 1 , @Array2 , 3 );
こんな代入も可能です $Array[0] には 1 が代入され、それから @Array2 の値が
それぞれ代入され、最後に 3 が入る事になります。
$Array[0] = "Hello World!!";
配列 @Arrayの先頭の要素 $Array[0] に文字列 "Hello World!!" が格納されます。
$Array[5] = "Hello World!!";
配列 @Arrayの 6つめの要素 $Array[5] に文字列 "Hello World!!" が格納されます。
しかし、0 〜 4の要素に何も入れていないと、プログラムが確保するメモリ領域が
無駄になるので、注意してください。
-----------------------------------------------------------------
※メモリ領域とは
プログラムが動作するサーバマシンのメモリの領域と考えていただいて結構です。
メモリというのは、一時記憶装置のことで、マシンのメモリが高いほど、処理速度が
速いと考えられます。
よくマシンを購入する時に、メモリ800Mバイトとか書いてあるのを見かけると
思いますが、これのことです。
したがって、無駄なメモリ領域を大量に使用してしまうと、処理速度が遅くなると
考えてください。
-----------------------------------------------------------------
@Array[1, 2, 3, 4] = ( 10, 20, 30, 40 );
先頭の要素は未定義になり 2 番目の要素から順に格納されます。
@Array[0]は空の要素になります。
@Array[0..2] = ( 10, 20, 30, 40 );
先頭の要素は10、2番目の要素が20、3番目の要素が30となり、40は無視されます。
[0..2]のように書くと、 0 から 2 まで 1 ずつ数値を足して表現するのと
同じ意味になります。
@Array = ();
空の配列を作成します。
配列を空にするときにも使用します。
@Array = @Array1;
@Array1の複製を@Arrayとして作成します。
この時@Arrayの大きさは@Array1に合わせられます。
$#Array = 2;
配列の大きさを変更します。(上記は$Array[0]〜$Array[2]の配列になります)
この時指定した数値より大きい添字のデータは破棄されてしまいます。
■参照
次に示すサンプル配列を元に、配列を参照するやり方を見てみます。
-----------------------------------------------------------------
@week = ('Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat' );
-----------------------------------------------------------------
上記の配列を作成したとします。
( $s1, $s2, $s3 ) = @week;
$s1へ先頭の'Sun'を、$s2へ'Mon'を、$s3へ'Tue'と順に変数へ格納されます。
( $s1, $s2, $s3 ) = @week[2..4];
$s1へ先頭の'Tue'を、$s2へ'Wed'を、$s3へ'Thu'と配列の参照場所を指定して
変数へ格納することもできます。
print $#week;
$#を使用する事によって、その配列で指定できる最大の添字を参照する事が出来ます。
表示結果は 6 になります。
print @week;
配列の全ての要素を出力します。ただし、この時出力される文字列は、区切り文字で
区切られている訳ではなく、全てべた打ちで表示されてしまいます。
表示 → SunMonTueWedThuFriSat
■配列操作配列の全ての要素に処理を行う
配列参照のループで、別の方法をご紹介します。
foreachを使用する
foreach $変数 ( @配列名 ) {
処理
}
こうすると、$変数に順番にその配列の中身を取り出して使用することができます。
-----------------------------------------------------------------
@week = ('Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat' );
foreach $tmp (@week) {
print $tmp;
}
-----------------------------------------------------------------
for ( 開始値 .. 終了値 ) {
処理
}
何番目から何番目を取り出すという時に使用します。
-----------------------------------------------------------------
@week = ('Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat' );
for ( 2 .. 4 ) {
print $week[$_];
}
-----------------------------------------------------------------
上記は、「TueWedThu」と表示されます。
★今日のまとめサンプルプログラム
-----------------------------------------------------------------
#! /usr/local/bin/perl
print "Content-type:text/html\n\n";
print << "END_OF_HTML";
<HTML>
<BODY>
END_OF_HTML
$sum = 0;
@array = (1,2,3,4,5,6,7,8,9,10);
foreach $tmp (@array) {
$sum += $tmp;
}
$sum /= @array;
print "平均は $sumです\n";
print << "END_OF_HTML";
</BODY>
</HTML>
END_OF_HTML
exit;
-----------------------------------------------------------------
■解説
foreachを使用し変数に値を足し込んで行き最後に平均を求めます。
$sum += $tmp;
は
$sum = $sum + $tmp;
と同じ意味ですね。つまり、$sumに配列の中身を順番に足していっています。
$sum /= @array;
は
$sum = $sum / @array;
と同じ意味なのですが、ここで@arrayというのは、10を返します。
このように記述すると配列の個数を返すようなので、覚えておくとよいかも
しれません。
★課題
1. 以下の 2つの配列をつなげた配列を作成してください。
@a = (1, 2, 3, 4);
@b = (5, 6, 7, 8);
2. 以下は、ある11人のテストの点数です。11人の合計点と平均点をHTML中に
表示するプログラムを作成してください。
75点、80点、88点、49点、69点、77点、93点、72点、81点、58点、72点
★前回の課題の解答
1. 以下のフローを満たすプログラムを作成してください。
→下のサンプルを参照してください。
-----------------------------------------------------------------
#! /usr/local/bin/perl
print "Content-type:text/html\n\n";
print << "END_OF_HTML";
<HTML>
<BODY>
END_OF_HTML
# (1)
$a = 32;
$b = 56;
# 掛け算の結果が150以上ならば「True」を表示、そうでなければ「False」を表示
if ($a * $b >= 150) {
print "True";
}
else {
print "False";
}
print "<br>";
# 掛け算の結果が200未満ならば「True」を表示、そうでなければ「False」を表示
if ($a * $b < 200) {
print "True";
}
else {
print "False";
}
print "<br>";
# 足し算の結果が80以上、かつ掛け算の結果が150未満ならば「True」を表示、
# そうでなければ「False」を表示
if ($a + $b >= 80 && $a * $b < 150) {
print "True";
}
else {
print "False";
}
print "<br>";
# 足し算の結果が90以下、または掛け算の結果が180以下なら「True」を表示、
# そうでなければ「False」を表示
if ($a + $b <= 90 || $a * $b <= 180) {
print "True";
}
else {
print "False";
}
print "<br>";
# (2)
@a = ("This ", "is ", "", "a ", "test.");
# for文を用いて、配列の中身を全て表示
for ($i = 0; $i <= $#a; $i++) {
print $a[$i];
}
print "<br>";
# 2番目(添え字は1)の中身が空の場合は「True」を表示、そうでなければ「False」を表示
if ($a[1] eq "") {
print "True";
}
else {
print "False";
}
print "<br>";
# 3番目(添え字は2)の中身が空で、かつ4番目(添え字は3)の中身がtextより小さい場合は
# 「True」を表示、そうでなければ「False」を表示
if ($a[2] eq "" && $a[3] lt "text") {
print "True";
}
else {
print "False";
}
print "<br>";
# (3)
@a = (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20);
# for文を用いて、偶数のみを表示
for ($i = 1; $i <= $#a; $i += 2) {
print $a[$i] . " ";
}
print "<br>";
# for文を用いて、5から14までを表示
for ($i = 4; $i < 14; $i++) {
print $a[$i] . " ";
}
print "<br>";
# while文を用いて、1から9までを表示
$i = 0;
while ($i < 9) {
print $a[$i++] . " ";
}
print "<br>";
# foreach文を用いて、3で割り切れる数字のみを表示
foreach (@a) {
if ($_ % 3 == 0) {
print $_ . " ";
}
}
print "<br>";
# (4)
@a = (32,646,308,431,639,78,143,169,490,144,612,113,327,51);
# for文を用いて、偶数のみを表示
for ($i = 0; $i <= $#a; $i++) {
if ($a[$i] % 2 == 0) {
print $a[$i] . " ";
}
}
print "<br>";
# foreach文を用いて、3で割り切れない数字を表示
foreach (@a) {
if ($_ % 3) {
print $_ . " ";
}
}
print "<br>";
# while文を用いて、2で割った答えを表示
$i = 0;
while ($i <= $#a) {
print $a[$i++] / 2 . " ";
}
print "<br>";
# for文を用いて、5で割った余りを表示
for ($i = 0; $i <= $#a; $i++) {
print $a[$i] % 5 . " ";
}
print "<br>";
print << "END_OF_HTML";
</BODY>
</HTML>
END_OF_HTML
exit;
-----------------------------------------------------------------
■解説
上のサンプルのように、$c = $a * $bとしなくても、
if ($a * $b >= 150)
と書くことができます。
また、割り切れない数字を判定する場合、
if ($_ % 3)
とやっていますが、割り切れる場合は、3で割った余りが 0 となりますので、
偽となり、割り切れない数字のみ、{ }の中が実行されます。
|