6章.繰り返し

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ではプログラムが終了してしまいますが,ループ内で流れを制御できる演算子が用意されています。

  1. last
    ループの途中でそのブロックから抜ける
  2. next
    ループの次の繰り返しへ進む
  3. redo
    ループを条件判定しないで再び実行する
$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によってここへ抜ける

[HOME]

Copyright (c)1996 GOMASUKE
Since 09/15/1996, Last Updated 09/15/1996