処理の制御

 色々な処理を行おうとすると、条件により制御を分けたり、ループを行ったりすると言ったことが必要になって来ます。ここでは、Perlでの制御文をご説明します。

分岐構造

 「もし〜だったら〜する」と言った場合のように、ある処理のブロックを実行するかしないかを決定する制御を行う構造を、分岐構造と呼びます。

(1)if 〜else文

 条件に応じて処理を分岐させ、プログラムの流れを変更します。「if〜else文」には、いくつかのパターンがあります。

パターン1・・・if (条件) {処理;}  条件が真ならば処理を行い、偽ならば処理を実行せずに次の行、又は条件に移ります。
 

パターン2・・・if (条件) {  このようにすれば、処理を複数実行させる事が出来ます。
           処理1;
            処理2;  
            ..........;  
         }  

パターン3・・・if (条件) {  条件が偽の時にも何らかの処理を行いたい時に使います。この場合、条件が真のときは処理1が、偽の時は処理2が実行つれます。
           処理1;
         }
        else {
            処理2;  
         }  

パターン4・・・if (条件1) {  複数の条件によって処理を分岐したい時に使います。途中の分岐には「elsif」を使い、最後は「else」を使います。
           処理1;
         }
        elsif (条件2) {  
            処理2;  
         }  
        elsif (条件3) {  
            処理3;  
         }  
        .........  
        else {  
            処理n;  
         }  

パターン5・・・if (条件1) {  書いた条件を全て評価して欲しい時に使います。条件を全て評価し、真になった部分の処理を全て実行します。
           処理1;
         }
        if (条件2) {  
            処理2;  
         }  
        .............  

(2)unless 〜else文

 if文とよく似ていますが、unlessの後の式の条件が正反対になります。つまり、条件が偽である時に処理が実行されます。

パターン1・・・unless (条件) {処理;}  条件が偽なら処理を行い、真なら処理を実行せずに次の行、又は条件に移ります。
 

パターン2・・・unless (条件) {  このようにすれば、処理を複数実行させる事が出来ます。
           処理1;
            処理2;  
            ..........;  
         }  

パターン3・・・unless (条件1) {  複数の条件によって処理を分岐したい時に使います。このように記述すると、条件式が偽となった部分の処理が実行されます。
           処理1;
         }
        elsif (条件2) {
            処理2;  
         }  
        .........  
        else {  
            処理n;  
         }  

ループ

 同じ行(処理)を複数回繰り返したい時に使います。ループには2種類あり、1つは条件に基づいてその条件が満たされるまで繰り返されるもの、もう1つは設定された範囲まで繰り返すものです。

(1)for文を使ったループ

 基本的に指定した回数だけ処理を繰り返すのに用いられます。書式は以下の通りです。

for (初期状態; 終了条件; 継続処理) {
    処理;
}

 for文の後ろには括弧に囲まれて、3つの式が続きます。この式のいずれか、又は全てを省略する事が出来ます。ただし、間の2つのセミコロン「;」は省略出来ません。では、実際の例を一つ。

for ($i = 1; $i <= 10; $i++) {  これは、初期状態が「$iが1」、終了条件が「$iが10になった時」、継続処理が「$iに1を足していく」と言うfor文です。
    処理;
}

 $iはカウンタと呼ばれるもので、数を数えるのに使います。条件はループの最初に評価され、継続処理はループ内の処理が終わって次のループに入る前に実行されます。

(2)foreach文を使ったループ

 Perlではfor文以外に、とても便利なforeach文があります。foreach文の書式は以下の通りです。

foreach 変数 (配列) {処理;}

 foreach文で使われる変数は、foreach文の中でローカル変数となります。foreach文で使われる変数は、続く{ }の中で変数の内容が変わったとしても、ループを抜け出る時にforeach文に入る以前の値が再び設定されています。尚、foreach文に変数がない場合は、$_と言うスカラー変数が暗黙的に使用されます。では、実際の例を一つ。

$i = 2;  $iには1〜10が代入され、10回繰り返されます。
foreach $i (1 .. 10) {
    print "\$i = $i\n;  ここの\$iは文字列「$i」として出力されます。\はエスケープシーケンスです。
}
  print "$i";  ここの$iには、ループ前の値が再び設定されます。
 

(3)while文を使ったループ

 ある条件が真(空文字列と0以外)である間、ループ繰り返します。while文の書式は以下の通りです。

while (条件式) {
    処理;
}

 条件は、真か偽で返される条件式なら、どのような式でも書く事が出来ます。では、実際の例を一つ。

$i = 0; 変数$iの初期化。
while ($i <= 10) {  
   print "\$i = $i";  
   $i++; 「$i++」は、「$i = $i + 1」の事。
}  

 尚、while文で無限ループを作る場合は、以下のように記述します。ただし、無限ループのプログラムを作成した場合には、next文last文などでループから抜け出す処理を実装しなくてはいけません。

while (1) {
    処理;
}

(4)until文を使ったループ

 until文はwhile文ととてもよく似ていますが、後に続く式の条件が正反対になります。つまり、条件が偽(空文字列、0)である時に処理が繰り返されます。until文の書式は以下の通りです。

until (条件式) {
    処理;
}

 条件は、真か偽で返される条件式なら、どのような式でも書く事が出来ます。

(5)do文を使ったループ

 do文は単独で使われる事はなく、今までに出て来たwhile文、until文と組み合わせて使います。つまり、「do〜while文」「do〜until文」の事です。while文、until文と異なる点は、少なくとも1回は処理を行ってから条件式を評価する点です。

do {処理;} while (条件式);

 do〜while文では、while文と同様に条件式が真(空文字列と0以外)の間、処理が繰り返されます。

do {処理;} until (条件式);

 do〜until文では、until文と同様に条件式が偽(空文字列、0)の間、処理が繰り返されます。

ループの制御

 ループをより使い易くする為に、Perlには「ラベル」とそのラベルに制御を移す為の文が用意されています。これらはfor文やwhile文の持っている終了条件だけでなく、ループの処理中に何らかの条件が成立した時、ループの動作を変える目的の為に使われます。実際に制御を行うには、ラベルの他に次のような命令を用います。

next last redo continue

(1)ラベル

 ラベルはループの流れを制御する為に使います。しかし、ラベルは必ず必要と言う訳ではなく、又単独では何の処理も行いません。ラベルは、next文、last文、redo文、continue文などと共に使います。ラベルは以下のように定義する事が出来ます。

<ラベル>: for (開始条件; 終了条件; 継続処理) {処理;}
<ラベル>: foreach 変数 (配列) {処理;}
<ラベル>: while (条件式) {処理;}
<ラベル>: while (条件式) {処理1;} continue {処理2;}
<ラベル>: {処理1;} continue {処理2;}

 ラベルの例としては、以下のようになります。

FIRST: for (; ; ) {処理;}
SET: while (1) {処理;}

 尚、ラベルの名前を全て大文字にしておけば、Perlの予約語と重なる事もなくなります。

(2)next文を使った制御

 next文は、ループの先頭に戻って再びループの実行を行う制御を実行します。next文は以下のように記述されますが、ラベルは省略する事も出来ます。

next <ラベル>;

 next文を使った例を示します。

LOOP: for ($i = 0; $i < 10; $i++) {
   if ($i % 2 == 0) {
     next LOOP;
   }
   処理;
}

 この例では、変数$iを2で割った時の余りが0の時にはループをその時点で止め、次の処理を行う事なくラベルLOOPに戻ると言う処理をしています。

(3)last文を使った制御

 last文は、ループを抜け出る制御を行います。last文は以下のように記述されます。尚、ラベルは省略できます。

last <ラベル>;

 last文を使った例を示します。

$i = 0;
while (1) {
   if ($i >= 5) {
     last;
   }
   処理;
}

 この例では、変数$iが5以上になったらwhile無限ループを抜け、次の処理を実行しません。

(4)redo文を使った制御

 redo文は、ループの先頭に戻る制御を行います。next文との違いは、条件式の評価を行わずにループを再実行する点です。redo文は以下のように記述されます。尚、ラベルは省略できます。

redo <ラベル>;

(5)continue文を使った制御

 continue文は、ループの条件式を再評価する前に、continue文に続く中括弧に書かれた処理を実行するものです。記述としては、以下のようになります。尚、ラベルは省略できます。

<ラベル>: while (条件式) {
処理;
}
continue {
処理2;
}

 continue文を使った例を示します。

$i = 0;
while (1) {
   if ($i >= 5) {
     last;
   }
   $i++;
}
continue {
   print "\$i = $i: continue処理です。\n";
}

 この例では、変数$iが5以下の場合、while無限ループを繰り返しますが、繰り返す前にcontinueの後に囲まれた中括弧内の処理が実行されます。

(6)入れ子になったループ

 ループの中でループを実行するような場合を「入れ子になったループ」と言います。この場合、まず最初に外側のループが初期化・実行され、そのループが実行される過程で内側のループも初期化・実行されます。内側のループが終わると外側のループの1回が終わる事になりますので、内側のループは外側のループよりも速く回り、更に回数も多くなります。では例を一つ。

for ($i = 0; $i < 10; $i++) {
   for($j = 0; $j < 10; $j++) {
      処理;
   }
}

 このような入れ子のループでは、外側のループが1回実行される間に、内側のループは10回実行される事になります。例はもう示さなくても大体分かりますよね(^.^)

正規表現 前へ

HOME

次へ サブルーチン