5. 繰り返し、条件分岐

Perl6には、たくさんの条件分岐・繰り返し構造があります。

5.1. if

このコードは条件を満たした時にだけ実行されます。

my $age = 19;

if $age > 18 {
  say 'Welcome'
}

Perl6では、コード部と条件部を逆順に書くことができます。
たとえコード部と条件部を逆順にしても、条件部が常に先に評価されます。

my $age = 19;

say 'Welcome' if $age > 18;

条件を満たさない場合に代わりに実行されるブロックを指定することができます:

  • else

  • elsif

# 変数の値によって違うコードを実行します
my $number-of-seats = 9;

if $number-of-seats <= 5 {
  say 'I am a sedan'
} elsif $number-of-seats <= 7 {
  say 'I am 7 seater'
} else {
  say 'I am a van'
}

5.2. unless

if 文の否定バージョンが unless です。

下のコードは:

my $clean-shoes = False;

if not $clean-shoes {
  say 'Clean your shoes'
}

こう書くことができます:

my $clean-shoes = False;

unless $clean-shoes {
  say 'Clean your shoes'
}

Perl6での否定は、 ! あるいは not で行います。

unless (条件)if not (条件) の代わりに使うことができます。

unlesselse 節を持つことはできません。

5.3. with

withif 文に似ていますが、変数が定義されているかどうかをチェックします。

my Int $var=1;

with $var {
  say 'Hello'
}

もし変数に値を代入していない場合、何も起こりません。

my Int $var;

with $var {
  say 'Hello'
}

withoutwith の否定バージョンです。 unless と関連付けて覚えることができるでしょう。

もし最初の with の条件が満たされない場合、代わりに実行されるコードを orwith で指定することができます。
withorwith は、 ifelsif と同じような関係です。

5.4. for

for ループは複数の値に対して繰り返しを行います。

my @array = [1,2,3];

for @array -> $array-item {
  say $array-item*100
}

配列の要素ひとつひとつに対して *100 するために、ループ変数 $array-item を作っていることに注意してください。

5.5. given

Perl6の given は、他の言語で言う switch文です。

my $var = 42;

given $var {
    when 0..50 { say 'Less than or equal to 50'}
    when Int { say "is an Int" }
    when 42  { say 42 }
    default  { say "huh?" }
}

マッチが成功すると、それ以降のマッチングは行われません。

proceed を使うことで、Perl6にマッチ成功後もマッチングを続けるよう指示することができます。

my $var = 42;

given $var {
    when 0..50 { say 'Less than or equal to 50';proceed}
    when Int { say "is an Int";proceed}
    when 42  { say 42 }
    default  { say "huh?" }
}

5.6. loop

loopfor ループを作るための別の方法です。

実際に、loop はC言語で for ループと同じようなものです。

Perl6はC言語ファミリーの一員なのです。

loop (my $i=0; $i < 5; $i++) {
  say "The current number is $i"
}
繰り返しと条件分岐についてさらに知るには、 http://doc.perl6.org/language/control(英語) を参照してください。