【Perl5】制御文(条件分岐と繰り返し処理)

2015年10月5日

if文(条件分岐)

条件が1個の時

if (条件式){
条件式が真の時に実行する処理1;
条件式が真の時に実行する処理2;
}else{
条件式が偽の時に実行する処理1;
条件式が偽の時に実行する処理2;
}

条件が複数ある時

if (条件式) {
条件式1が真の時に実行する処理1;
条件式1が真の時に実行する処理2;
} elsif ($xx == 5) {
条件式2が真の時に実行する処理1;
条件式2が真の時に実行する処理2;
} else {
条件式1と2がいずれも偽の時に実行する処理1;
条件式1と2がいずれも偽の時に実行する処理2;
}

否定制御文(条件分岐)

unless (条件式){
条件式が偽の時に実行する処理1;
条件式が偽の時に実行する処理2;
}else{
条件式が真の時に実行する処理1;
条件式が真の時に実行する処理2;
}

ループ文(while)

while (条件式){
実行する処理1;
実行する処理2;
}

$i = 1;
while ($i < 10) {
    print "i = $i\n";
    $i++;
}

ループ文(until)

until (条件式){
実行する処理1;
実行する処理2;
}

$count = 0;
until ($count >= 2){
  print "count = $count ¥n";
  $count ++;
}

do文

do{...} を使うと
if(...), unless(...), while(...), until(...) の構文順序を変更することができます。

do { print "i = $i\n"; } if ($i == 5);
do { print "i = $i\n"; } unless ($i == 5);
do { print "i = $i\n"; $i++; } while ($i < 5);
do { print "i = $i\n"; $i++; } until ($i > 5);

do {...} の中身が単文の場合は、do { ; } を省略することができます。

print "i = $i\n" if ($i == 5);
print "i = $i\n" unless ($i == 5);
print "i = $i\n" while ($i++ < 5);
print "i = $i\n" until ($i++ > 5);

for文

for (初期化; 条件式; インクリメント){
実行する処理1;
実行する処理2;
}

for ($count = 0; $count < 10; $count++){
  print "count = $count ¥n";
}

foreach文

foreach 変数 (リスト){
実行する処理1;
実行する処理2;
}

リストの値を格納する変数を省略することもできます。
変数を省略した場合には、デフォルト変数として「$_」と言う変数が使用されます。

foreach (リスト){
実行する処理1;
実行する処理2;
}

my @city = ("東京", "名古屋", "大阪");

foreach my $name (@city){
  print "$name¥n";
}

もしくは

my @city = ("東京", "名古屋", "大阪");

foreach (@city){
  print "$_¥n";
}

last文

C 言語系や Java の break 文と同じ動きをします。最も内側のループを抜けます。

my $count = 1;

while (1){
  print "$count¥n";
  $count++;

  if ($count > 5){
    last;
  }
}

next文

C 言語系や Java の continue 文と同じ動きをします。
next 以降の処理を実行せずに次の条件式の評価を行います。

my $count = 0;

while ($count <= 5){
  $count++;

  if ($count == 2){
    next;
  }

  print "$count¥n";
  
  #next演算子が実行されるとこの位置に進む
}

continue文

C 言語系や Java の continue 文とは違う動きをします。

while 文で次のループにを実行する前に
continue 内の処理を実行してからループへ進みます。
continue を使うと、while 文を for 文のように使うことができます。

$i = 1;
while ($i < 10) {
    print "$i\n";
} continue {
    $i++;
}

for ($i = 1; $i < 10; $i++) {
    print "$i\n";
}

と同じ結果になります。
ただし、変数 $i の最終的な値が
continue 有りでは 10 になりますが、continue 無しでは 11 になります。

redo文

redo 文が実行されるとその回のループ処理の先頭の位置まで処理を戻して
改めて繰り返し処理を行います。

my $count = 0;
while ($count <= 5){
  #redo演算子が実行されるとこの位置に進む
  $count++;
  if ($count == 2){
    redo;
  }
  print "$count¥n";
}

while文、until文、for文、foreach文の他に裸のブロック内に記述できます。

繰り返し処理にラベルを付ける

「last」演算子、「next」演算子、「redo」演算子と一緒にラベルを使うことで
繰り返し処理の中でより細かい制御ができるようになります。
ただし、演算子が記述されている最も内側の繰り返し処理です。

式修飾子

繰り返し処理において実行する処理が1つの場合は式修飾子を使うことができます。
利用できるのは while 修飾子、until 修飾子、そして foreach 修飾子です。

真の時に実行する処理 while 条件式;
真の時に実行する処理 until 条件式;
実行する処理 foreach 条件式;

※なお foreach 文の場合には制御変数とリストを指定する必要がありますが、
foreach 修飾子では、省略した場合に使用される「$_」が制御変数として使用されます。

my @name = ("山田", "山本", "佐藤");

print "$_¥n" foreach @name;

Perl5入門

Posted by 管理人