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

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

2022-01-16 02:47:18

I. 条件付き判定

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

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

i f 文のもう一つの作り方は、複数の式を使い、どの式が真になるかによってコードを実行することです。上のステートメントブロックは、次のように読むことができます。e x p r e s i o n 1 と書かれた式が真であれば、B L O C K 1 というステートメントブロックが実行されます。そうでなければ、制御は e l s i f に移り、e x p r e s i s i o n 2 でテストが実行されます。式が真であれば
そして、B L O C K 2 を実行し、e x p r e s i n 1 と e x p r e s i n 2 のいずれも真でなければ、B L O C K 3 を実行します。

II. ループ

1. while ループ

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

  while ( ) {
  }

2、untilループ
コピーコード コードは以下の通りです。

  until ( ) {
  }

3. C言語ライクなforループ、例えば
コピーコード コードは以下の通りです。

  for ($count=1; $count <= 5; $count++) {
    # statements inside the loop go here
 

forループでカンマ演算子を使用する例を以下に示します。
コピーコード コードは以下の通りです。

  for ($line = , $count = 1; $count <= 3; $line = , $count++) {
    print ($line);
  }

以下の記述と同等です。
コピーコード コードは以下の通りです。

  $line = ;
  $count = 1;
  while ($count <= 3) {
    print ($line);
    $line = ;
    $count++;
  }

4. リスト(配列)の各要素に対してループをかける:foreach、構文は以下の通り。
コピーコード コードは以下の通りです。

  foreach localvar (listexpr) {
    statement_block;
  }


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

  foreach $word (@words) {
    if ($word eq "the") {
      print ("found the word 'the'\n");
    }
  }

注意事項
(1) ここでのループ変数localvarはローカル変数で、それ以前にすでに値を持っていた場合、ループ後もその値が復元されます。
(2) ループ内のローカル変数を変更すると、対応する配列変数も変更される、例.
コピーコード コードは以下の通りです。

  @list = (1, 2, 3, 4, 5);
  foreach $temp (@list) {
    if ($temp == 2) {
      $temp = 20;
    }
  }

この時点で@listは(1, 20, 3, 4, 5)になっています。
5. ループを行う
コピーコード コードは以下の通りです。

  do {
    statement_block
  } while_or_until (condexpr);

  doループは、ループを少なくとも1回実行する。
6. ループ制御
  次のループはnextで、C言語のcontinueと同じです。PERLでユニークなコマンドはredoで、これはループを繰り返す、つまりループ変数は変更せず、ループの最初に戻ることを意味します。
7. 伝統的なgoto label;ステートメント。

III. 単一行条件文 
  文法は文キーワードcondexpr.で、キーワードはif, unless, while, untilのいずれかを指定します。

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

    print ("This is zero.\n") if ($var == 0);
    print ("This is zero.\n") unless ($var ! = 0);
    print ("Not zero yet.\n") while ($var -- > 0);
    print ("Not zero yet.\n") until ($var-- == 0);

  条件判断は後から書かれているが、先に実行される。

ディレクティブ: unless if not
unlessは、"判別式が真でなければ..."を実行する、という意味です。
構文 I:

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

unless(discriminant operator) {
Block of statements when the discriminant is false;
}

上記の構文は、Perlでは、discriminant is false unless (discriminant operator)のように書くこともできます。

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

print"Please enter your score? \n";
$scorre=; # for standard input, will let the user enter a string
chop($score); #Remove the last newline character \n from $score
unless($score<60)
{
print"Your score is passing! \n";
}

また、次のように書くこともできます。 print"あなたのスコアは合格です! \但し、unless($score<60)です。
構文 II:
コピーコード コードは以下の通りです。

unless (discriminant operator)
{
Block of statements when the discriminant is false;
}else{
Statement block when the discriminant is true;
}


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

print"Please enter your score? \n";
$scorre=;
chop($score);
unless($score<60)
{
print"Your score is passing! \n";
}else{
print"Your score failed! \n";
}

Advanced Tips:&&,||and? : を制御構造として使用する。
これらは句読点のようにも、式の一部にも見えます。しかし、Perlでは制御構造として使用することができます。
例えば
コピーコード コードは以下の通りです。

 if (discriminant expression)
  {block of statements when true};

と書くこともできます。
コピーコード コードは以下の通りです。

 Statement block if (discriminatory expression) when true

しかし、もっとシンプルな方法であれば
コピーコード コードは以下の通りです。

 Block of statements when the discriminant && is true

なぜかというと、&&は論理的なwith演算子だからです。
  判別式が真であれば、式の値はその後に続くステートメントブロックの値に依存します。そこで、真であるステートメントブロックが実行される(値を求めるために使用される)。
  判別式が偽の場合、その後に続くステートメントブロックの値に関係なく、式全体が偽となります。そのため、ステートメントブロックがfalseのときは実行されない。
同じ意味で、unless(this){that}はthis||thatに置き換えることができる。
? expression example:exp1?exp2:exp3 は、「exp1 が真なら exp2 の値を求め、そうでないなら exp3 の値を求める」という意味です。