Search A.I.
Menu
ホーム

メールマガジン ホームページプログラミングテク

Windowsテク
Javaアプレット サンプル
Java Q & A
JavaScript Q & A
Perl Q & A
Perl レッスン
PHP レッスン
PHPテク
MS-DOS コマンド集
UNIX コマンド集
SQL コマンド集
SEの基礎講座
WEBシステム開発受注します
]無料フォームメール送信サービス
リンク集
Perl レッスン

1. Perl の基礎
2. Perlの文法、条件式
3. Perlの文法、条件式 - 続き
4. 配列について
5. ハッシュ配列について
6. Perlの基礎 - 続き
7. 関数について
8. 関数について - 続き
9. 文字列操作関数
10. 配列操作関数
11. ファイル操作
12. ファイル操作 - 続き
13. パラメータの受け渡し
14. クッキーについて
15. 総合練習
16. メール送信
17. ファイルアップロード
18. パッケージの使用方法
19. MySQL
20. MySQL - 続き(1)
21. MySQL - 続き(2)
22. PostgreSQL
23. 総合練習
24. 総合練習解答



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 となりますので、
偽となり、割り切れない数字のみ、{ }の中が実行されます。




前の章へ 次の章へ


このエントリーをはてなブックマークに追加


OfficeLance

お問い合わせはこちらから