1〜nまでの和を求めるプログラムを作ってみましょう。
6.1.初期値
N88BASICはRUNしたときに変数は初期化されます。すなわち,数値変数には(0)が 文字変数には空文字列(ヌルストリング)が代入されます。
perlも同様に未定義値(undef)というものを持っています。この値は,変数を数値として扱えば(0), 文字として扱えば空文字列が入っているものとされています。
全てのページでは,わざわざ初期値を定義していますのでご承知おき願います。
6.2.if文を使うループ方式
N88BASIC perl
1000 I=0:J=0:N=10 $i = 0; $j = 0 ; $n = 10;
1010 I=I+1 $i++; #$i = $i + 1;
1020 IF I<=N THEN J=J+I:GOTO 1010 if ($i <= $n ) { $j = $j + $i;
1030 PRINT J gotoは使わないようにしていた
チョット無理だ!!
55
perlのif文の形式
if (cond) {
条件(cond)が真(true)の場合の命令(true_statement)
} else {
条件(cond)が偽(false)の場合の命令(false_statement)
}
必要なければ,elseブロックは省略可能です
if (cond1) {
true_statement1;
} else {
if (cond2) {
true_statement2;
}
}
は以下のように書くことができます
if (cond1) {
true_statement1;
} elsif (cond2) {
true_statement2;
}
条件の部分が,空文字列か("0")の場合は偽(false)と判断されます。
perlのunless文の形式
unlessはif文の逆の判断がされるものと覚えて下さい。
unless (cond) {
条件(cond)が偽(false)の場合の命令
} else {
条件(cond)が真(true)の場合の命令
}
必要なければ,elseブロックは省略可能です
6.3.forループ方式
N88BASIC perl
J=0:N=10 $j = 0 ; $n = 10;
FOR I=1 TO N for ($i = 1; $i <= $n; $i++) {
J=J+I $j += $i; #$j = $j + $i;
NEXT I }
PRINT J print "$j\n";
PRINT I print "$i\n";
55
11
perlのfor文の形式
for (初期値; 条件; 増分) {
条件が真の場合の命令
}
初期値は空(;)でもかまいません
6.4.whileループ方式
N88BASIC perl
I=1:J=0:N=10 $i = 1; $j = 0; $n = 10;
WHILE I<=N while ($i <= $n) {
J=J+I $j += $i;
I=I+1 $i++;
WEND }
PRINT J print "$j\n";
PRINT I print "$i\n";
55
11
perlのwhile文の形式
while (cond) {
条件が真の場合の命令(条件が偽になるまでループする)
}
まず,条件が評価され真の間はブロック中の命令を行います
条件が偽の間,ブロック中の命令を行うのはuntil文です
until (cond) {
条件が偽の場合の命令(条件が真になるまでループする)
}
まず,条件が評価され偽の間はブロック中の命令を行います
条件が反対の状態に成らなければwhile/untilともに無限ループしてしまいます。
6.5.foreachループ方式
N88BASIC perl
J=0:N=10 $i = 1; $j = 0 ; $n = 10;
FOR I=1 TO N foreach $i (1 .. $n) {
J=J+I $j += $i;
NEXT I }
PRINT J print "$j\n";
PRINT I print "$i\n";
55 55
11 1
最後のperlの$iの値が(1)になっているのに気がつきましたか?
これは,foreach文で使用している変数($i)はブロック内でのみ参照可能な
局所的(ローカル)な変数だからです。最初の行の$i=1;の$iとforeachの$iは別物です。
変数(この場合は$i)を省略した場合は$_という特殊変数が用いられます。
..は範囲演算子と呼ばれています。(1 .. 5)は(1,2,3,4,5)というリスト, (1.5 .. 4.0)は(1.5,2.5,3.5)というリストです。
perlのforeach文の形式
foreach var (list) {
listの要素を順次,変数varに渡します
}
6.6.ループの流れ制御
perlのループ内での流れ制御
exitではプログラムが終了してしまいますが,ループ内で流れを制御できる演算子が用意されています。
$i = 0; $j = 1;
while ($i == 0) {
$j *= 5; #$j = $j * 5;
if ($j > 100) { last; }
}
print "$j\n"; #lastによってここへ抜ける
125
多重ブロック(入れ子形式)の制御にはラベルを利用します。
$i = 1; $j = 0; $k = 0;
LABEL1: while ($i <= 10) {
while ($j < 10000) {
$k++;
if ($k > 100) {
last LABEL1;
}
$j += $k;
}
$i++;
}
#last LABEL1によってここへ抜ける
Copyright (c)1996 GOMASUKE
Since 09/15/1996, Last Updated 09/15/1996