1. ホーム
  2. スクリプト・コラム
  3. パール

Perlの制御構造に関する学習ノート

2022-01-28 06:24:49

I. ステートメントの種類

コンピュータは、繰り返し作業を行うことができるという利点がある道具です 。ループの実行、ループ文.
多くの判断が必要、条件付きで実行、条件文
シーケンシャルステートメント。
式真偽値まとめ
式は論理式である必要はないが、真と偽の値が得られることが必要である。
偽の値です。
論理値はfalse
値が0である
文字列が空である
リストが空です
アンデフ
その他の場合は真

II. 条件文のif

フォーム

コピーコード コードは以下の通りです。

if(expression){ Spaces are ignored, line breaks can be different
                    if(expression)
statement} {
elsif(expression) { statement
                     }
  statement}
....
else{
   statement
}

説明

(1) elsif, elseの部分は省略可能です。
(2) elsifキーワードに注意する。
(3) ステートメントブロック{}は必ず必要ですが、空でもかまいません。
(4) 入れ子にすることができる。
(5) 意味すること。真であれば実行する、式は実行条件である。

III. 条件文 UNLESS

コピーコード コードは以下の通りです。

unless(expression){statement}

if条件の逆で、式が真でなければ文を実行し、真であれば終了する、式が終了条件です。

IV. whileループ

コピーコード コードは以下の通りです。

while(expression){statement}

(1) 実行条件であるexpressionがtrueの時に実行する。
(2)条件はfalseになる可能性があるように設定しないと、非拘束ループから抜け出せない。
do{statement}while(式)
少なくとも1回、判定前に1回実行する。

V. までのループ文

コピーコード コードは以下の通りです。

until(expression){statement}

(1) whileとは逆に、式が真にならなくなるまで文を実行する。
(2) 真のとき停止し、式が終了条件となる。
コピーコード コードは以下の通りです。

do{statement}until expression)

条件判定の前に少なくとも一度はステートメントを実行する。

VI. for ループ

for(式1;式2;式3){statement}。
(1) 式1:制御変数などを初期化し、最初のループでのみ実行され
    カンマ区切りで複数の変数に値を代入する。
(2)式2:ループ毎に比較し、真の時にループする。
(3)式3:ループの各実行後に実行される、制御変数の値を変更すると、通常は自己増加する。
(4) 3つの式はすべて省略可能だが、2つの ; は必ず残すこと for(;;)
(5) 1番目と3番目の式は、複数のステートメントを実行するために使用することができます。

例: for($line=<>,$count=1;$count<10;$line=<>,$count++){print $line;}.

VII. foreachステートメント

foreach $w(リストまたは配列) {statement}.
(1) 配列@aの中の()、またはリスト(1,2,3)
(2) $wは新しい変数、または使用済みの変数で、ループ終了時にその値が復元されます。

(3) 各ループでは、配列の長さに関係なく、リストまたは配列の値を順番に$wに代入していき、リストが空になるまで繰り返します。
(4) ループ本体で$wの値が変更された場合、対応するデータ要素の値も変更される。
(5) リストが定数の場合、$wの値を変更することはできません。
(6) $wと@aは同じでもよい、例えば$a(@a)
(7) for と foreach は互換性があり、普遍的である。

foreachの形式
(1) foreach $a(@a){} 一般的な形式です。
(2) foreach $a(1,2,3,4){} リスト
(3) foreach $k(keys%h){} ハッシュフォーム
(4) foreach $a(@a[1,2,3]){} 配列の一部の要素に対してのみ。
(5) foreach (@a){} ループ変数が省略され、デフォルトは $_ になる。
    デフォルト変数$_、printで変数$_を表示します。
(6) grep,map関数は、各要素に対してforeachと同等です。

VIII. ループ制御

 last:ループを終了する
 next:次のループを実行、ループ内のnext以下の文は今回実行されず、変数の自己インクリメントを実行するため。
 redo:このループを再実行し、forは、do文の変数自己インクリメントを実行しない、無効である、使用することをお勧めしません。
 goto:ジャンプ、ループやサブルーチンにジャンプすることはできませんが、構造化プログラミングにはお勧めしません。

IX. マークアップ

タグは文字とアンダースコアのみで、通常は大文字で、:で区切られます。
マーカー定義:ループ文やステートメント(goto)の前に定義されます。
一般に、ネストされたループの内側のレベルから一番外側のレベルにジャンプするときに使用され、lastは一番外側のループを終了してプログラムが続行されることを意味する。
一番外側のレベルにジャンプして再度実行するのではありません。


コピーコード コードは以下の通りです。

#! /usr/bin/perl
print "Using tags:";
LABEL:for($i=1;$i<5;$i++){
        for($j=1;$j<5;$j++){
             print "$j";
             last LABEL if $i==3;
         }
        }
print "\$i=$i";

x. 継続文ブロック

continue{statement}

(1) ループ文に続き、ループ本体の後、次の条件判断の前に実行される。
(2) {}で識別されるステートメントのブロックの後にも使用できます。
(3) lastの次は実行されず、nextとなる。

XI. 単一行条件文とループ文

条件文:文が先、条件が後。print $a if $a==0; ただし、文を実行する前に条件を先にテストする。
同様に

コピーコード コードは以下の通りです。

unless: print $a unless($a==0);
while: print $a while($a-==0);

注意:ループ文は制御変数を失い、デッドループを発生させないこと。
|||,&& を使った条件文: $a==0&&print $a;
                  open(F,'file')||die "can't open";
die関数:コンソールに標準エラー出力メッセージを表示した後、プログラムを終了します。
warn: メッセージを出力した後、プログラムを終了せず、警告の役割を果たすだけです。
$! :エラーコードを格納する内部変数です。
内部変数にエラーメッセージが含まれます。

XII. まとめ

1. 条件文。

コピーコード コードは以下の通りです。

if (expression){statement}
  elsif(expression){statement}
  ....
  else{statement}

2. 一行文 if(expression)。

3. || または && およびフォーム

4.? は、:form

5. unless(expression){statement}の場合。
  (式)でない限り、1行の文です。

6. while until ループ

 while(expression){statement}とする。
 do{statement}while(式)
 while(式){statement}continue{statement}。
 一行文 while(式)
 until(expression){statement}まで
 do{statement}until(式)
 until(expression){statement}継続{statement}。
 一行文 until(expression)

7. for foreachループ

 for(式1;式2;式3){statement}。
 foreach (@a){statement}.
 foreach $k(keys%hash){statement}.

8. ループ制御:last,next,redo

9.マークアップ:goto LABEL