| Top Page | プログラミング | Perl 目次 | prev | next | 索引 |

2. 処理の流れの制御:順次処理,条件判断,繰り返し

コンピュータの中央処理装置は,メモリに記憶した機械語の命令を順次 実行していきます.でも,それだけではできることが限られてしまいます. 順次処理だけでなく,メモリ中で命令から命令へとジャンプをすることで, できることの幅が大きく広がります. Perl の文法にも,命令のジャンプを表現するための構文がいろいろ 用意されています.

実用になりそうなプログラム例はまだ出てきませんが, もうちょっと辛抱してください. 次のページからそれらしい例がでてきます.


if 文を使った条件判断

条件判断して処理の流れをかえるには,if 文を使います. if 文はこんな構造をしています.

if (論理式1) {   #  論理式1が成り立っている(式の値が"真")の場合
    処理1
}
elsif (論理式2) {  #  論理式1は不成立(偽)だが,論理式2は真の場合
    処理2
}
else {    #  論理式1も2も不成立の場合
    処理3
}

コメントを見れば意味はあきらかですね. elsif や else はあってもなくてもかまいません. 処理と書いてあるところには,何行でも書けます. なお,ある条件が満たされるときに行われる一連の処理は, { と } で囲みます.これは必須です. { } で囲まれた部分はブロックと呼びます.

{} で囲まれた範囲はインデント(頭下げ)して書きます. 下げても下げなくてもプログラムの動作には影響しませんが,人間が読みやすい, 処理の流れが見てとりやすいプログラムにするために, 必ずインデントします.インデントの文字数や,{ や } を書く場所には いくつか流儀があります. このペ−ジでは,インデントは4文字分で統一しています.

※(注意)プログラム中のインデントに全角の空白を使ってはいけません. エラーが出ます.エディタによっては,全角の空白のところは点線の四画形を 表示するなどして,知らずに全角空白が紛れ込むことのないようにできます.

if や elsif のあとの () の中の論理式と書いてあるところには, 論理的に真(正しい)か偽(誤り)かが判断できるような式を書きます (実は,どんな式も真か偽か評価できるのですが,それについてはもうちょっと あとで説明します).

論理式のなかでは,しばしば比較演算子というものが使われます.

文字列比較はだいたい想像がつくと思いますが,eq は equal,ne は not equal, gt は greater than,lt は less than,ge は greater or equal,le は less or equal です.文字列の大きい,小さいというのは文字コードの大小,英文字ならアルファベット順で うしろのほうほど大きいと評価されます.

論理演算子 &&(かつ) ||(または) ! (否定)なども使われます.

以下のプログラムでは,数値の比較演算子を使って,変数 $x の値によって 画面に表示するメッセージを決めています.

$x = 2;

if ($x == 3) {
    print "x is 3.\n";
}
elsif ($x > 0)  {
    print "x is larger than 0, but not 3.\n";
}
else {
    print "x is not larger than 0.\n";
}

<練習>

while 文で繰り返し

同じような処理をなんども繰り返したいことがよくあります. そのための構文がいくつかあります. まずは while 文を説明しましょう.

while (論理式) {
     処理
}

while 文では,論理式を評価した結果が真であるあいだは何度でも {} 内の処理を繰り返します. 最初の処理の前に一度論理式を評価して,偽だったら {} 内(ブロック)の処理は一度も実行しません. 真だったら ブロック内の処理を一度実行します.そのあとふたたび論理式を評価して, 偽ならばそこで繰り返しを終了.もし真だったらばふたたびブロック内の処理を一度 実行し… というように繰り返し処理を行います. while (論理式) {処理} と書かれていたら,「論理式が真のあいだは {処理}をする」あるいは " While 論理式 is true, do {処理}" と読めば理解しやすいでしょう.

なお,ここで仮に論理式と呼んでいるものが実は任意の式でよいのは if () の場合と同様です.

同じ論理式の評価を繰り返しているので,最初に真だったらいつまでも真のまま, 無限に処理を繰り返してしまいそうな気がしますが,必ずしもそうではありません. たとえば,ブロック内の処理によって論理式のなかにでてくる変数の値が変化すれば, はじめは真だった論理式が途中で偽になることがあります.例を見てみましょう.

$i = 0;

while ($i < 10)  {
    print $i, "\n";
    $i = $i + 2;
}
print "The End\n";

このプログラムは,$i がゼロの状態から始まるので,式 $i < 10 は最初は真, {} 内(ブロック)の処理を終わったところで $i は 2 になる, 2 も 10 より小さいから式は真,またブロック内の処理が実行されて…(中略)… $i が 10 になったところで式 $i < 10 は偽になり,ブロックの外へ抜けて The End と表示されます. ブロック内の処理によって $i の値が変化するために,何回も繰り返すうちに 論理式の真偽が変わるのです.

<練習>

while 文はいろんな場面で使います.もう少しあとのページでは,データファイルを 読み込むときに使う例がでてきます.


for 文で繰り返し

次は,for 文を使った繰り返しです. for 文はこんな構造をしています.

for (初期設定;  論理式;  繰り返しごとに実行) {
    処理
}

for のあとの () の中は,セミコロン ; で区切られた3つの部分から なっています.これらを使って,こんなふうに繰り返し処理を行います.

例を見てみましょう.

for ($i = 0; $i < 10; $i = $i + 1) {
    print $i, "\t", "Goal!", "\n";  #   "\t" はタブ文字.
}

最初に一回だけ実行されるのは $i = 0 の部分です. $i という変数にゼロが代入されます. 次に $i < 10 という式が評価されます.当然これは真ですから, ブロック内の処理が実行されます. そのあと,$i = $i + 1 が実行され,$i は 1 になります.

2回めの繰り返しをはじめるまえに,ふたたびまん中の式 $i < 10 が 評価されます.今度も真となるので,ブロック内の処理が実行されます. 以下,まん中の式の値が偽となるまで繰り返えされます.

<練習>

このほかにもいくつか繰り返し用の構文があります. このうち,for 文に似た foreach 文をもっとあとで紹介します.


何重にも入れ子にできる

if,for, while などの文のブロックのなかに,さらに if や for や while を 書くことができます.このような構造を入れ子(いれこ)と呼びます.入れ子の 深さ(何段階の入れ子になっているか)には制限はありません.

for ($i = 0; $i < 10; $i = $i + 1) {
    for ($j = 0; $j < 10; $j = $j + 1) {
        if ($i == $j) {
            print "i and j are equal.\n";
        }
        else {
            print "i and j are NOT equal.\n";
        }
    }
}

入れ子構造のあるプログラムを書くときは,入れ子の深さに応じて文頭の頭下げ (インデント)も大きくして,全体の構造が見えやすいように書きましょう.

繰り返し構文には,処理を柔軟に制御するためのおまけ機能がついてます. next や last というものです. これらはすぐあとで実例とともに出てきます(>実例).



| Top Page | プログラミング | Perl 目次 | prev | next |