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