第5章 制御構造

5-1. 真と偽

制御構造としての条件式やループ文を学習する前に、真 (true) と偽 (false) について理解をしておきましょう。
真と偽の定義については次のとおりです。
数値の 0
文字列の "0"
空き文字列 ""
未定義値
上記以外のもの
これを、以下の具体例で判断してみましょう。
0 数値の 0 なので偽
1 数値の 1 なので真
-1 数値の 0 ではないので真
3 - 3 数値として結果が 0 なので偽
0.0 数値の 0 なので偽
"0" 文字列の 0 なので偽
"0.0" 文字列の 0.0 は 0 とは異なるため真
A 文字列の A は真
"" 空き文字列なので偽
undef() 未定義値を返す関数なので偽
pagetop

5-2. 条件式

条件式とは、「もし~ならば…」という条件構文を定義するもので、if文と unless文の2つが用意されています。
条件式には、通常 比較演算子 を使用して条件を定義します。
unless文は if文の逆の意味を持ちます。
構文 if ( 条件A ) { 実行A }
elsif ( 条件B ) { 実行B }
else { 実行C }
内容 もし、「条件A」が真であるならば、「実行A」を実行する。
もし、「条件A」が偽で、「条件B」が真ならば、「実行B」を実行する。
もし、「条件A」「条件B」が偽であるならば、「実行C」を実行する。
コード例
1if ($size eq "big") { print "大きい\n"; }
2elsif ($size eq "middle") { print "中くらい\n"; }
3else { print "小さい\n"; }
pagetop

5-3. ループ文

ループ文とは、ある条件のもとで、処理を繰り返し実行するもので、次の6つの構文が用意されています。
構文名 構文 内容
while文
until文
while ( 条件 ) { 実行 }
until ( 条件 ) { 実行 }
「条件」が真である間は「実行」を実行
「条件」が偽である間は「実行」を実行
do {} while文
do {} until文
do { 実行 } while ( 条件 )
do { 実行 } until ( 条件 )
「実行」を1度実行し、条件が真である間は「式」をさらに実行
「実行」を1度実行し、条件が偽である間は「式」をさらに実行
for文 for ( 初期化 条件式 増減式 ) { 実行 } 「条件式」が真であれば「実行」を実行し、次に「増減式」を実行
foreach文 foreach 制御変数 ( リスト値 ) { 実行 } 「リスト値」の要素を順に「制御変数」にセットし、「実行」を実行
1. while文
1$i = 3;
2while ($i > 0) {
3    print "カウントダウン : $i \n";
4    $i--;
5}
1>  カウントダウン : 3
2>  カウントダウン : 2
3>  カウントダウン : 1
2. until文
untilは、whileと「条件」の評価が逆になるだけです。
1$i = 3;
2until ($i <= 0) {
3    print "カウントダウン : $i \n";
4    $i--;
5}
1>  カウントダウン : 3
2>  カウントダウン : 2
3>  カウントダウン : 1
3. do {} while文
whileは、ブロック内を実行する前に、条件を評価することに対して、
do {} whileは、ブロック内を1度実行した後、条件を評価するところがwhileと異なります。
1$i = 3;
2do {
3    print "カウントダウン : $i \n";
4    $i--;
5}
6while ( $i > 0 );
1>  カウントダウン : 3
2>  カウントダウン : 2
3>  カウントダウン : 1
4. do {} until文
do {} untilは、do {} whileと「条件」の評価が逆になるだけです。
1$i = 3;
2do {
3    print "カウントダウン : $i \n";
4    $i--;
5}
6until ( $i <= 0 );
1>  カウントダウン : 3
2>  カウントダウン : 2
3>  カウントダウン : 1
5. for文
1for ( $i = 3; $i > 0; $i-- ) {
2    print "カウントダウン : $i \n";
3}
1>  カウントダウン : 3
2>  カウントダウン : 2
3>  カウントダウン : 1
6. foreach文
1foreach $i (3, 2, 1) {
2    print "カウントダウン : $i \n";
3}
1>  カウントダウン : 3
2>  カウントダウン : 2
3>  カウントダウン : 1
pagetop

5-4. ループ制御

前項のループ文の使用において、ループの流れを変えるために、次の3つの演算子が用意されています。
演算子 内容
next ループをスキップする
last ループを終了する
redo ループを先頭の位置まで戻してやり直す
1. next演算子
1foreach $i (5, 4, 3, 2, 1) {
2    if ($i == 3) { next; }
3    print "カウントダウン : $i \n";
4}
1>  カウントダウン : 5
2>  カウントダウン : 4
3>  カウントダウン : 2
4>  カウントダウン : 1
2. last演算子
1foreach $i (5, 4, 3, 2, 1) {
2    if ($i == 3) { last; }
3    print "カウントダウン : $i \n";
4}
1>  カウントダウン : 5
2>  カウントダウン : 4
3. redo演算子
使い方を誤ると、無限ループになるので十分に注意してください。
01$n = 0;
02foreach $i (1 .. 5) {
03    print "$i\n";
04 
05    if ($i == 3) {
06        $n++;
07        last if ($n >= 2); # やり直しは2回で終了(無限ループ回避)
08 
09        # $iが3になったらループやり直し(ループの先頭へ移動する)
10        redo;
11    }
12}
1>  1
2>  2
3>  3
4>  3
pagetop

5-5. 三項演算子

三項演算子とは、ifの条件式を短縮して(一行にして)表記する技法です。
覚えておくと、非常に便利な書き方です。
構文
[条件式] ? [真のとき評価される式] : [偽のとき評価される式]
1$age = 18;
2print $age >= 20 ? "成人\n" : "未成年\n";
1>  未成年
また、if ~ elsif ~ else 式の条件文も可能です。
1$point = 82;
2$result =
3    $point >= 90 ? '優' :
4    $point >= 80 ? '秀' :
5    $point >= 70 ? '可' :
6    '不可';
7 
8print "あなたの成績は$resultです。\n";
1>  あなたの成績は秀です。
pagetop