第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() | 未定義値を返す関数なので偽 |
5-2. 条件式
条件式とは、「もし~ならば…」という条件構文を定義するもので、if文と unless文の2つが用意されています。
条件式には、通常 比較演算子 を使用して条件を定義します。
unless文は if文の逆の意味を持ちます。
コード例
条件式には、通常 比較演算子 を使用して条件を定義します。
unless文は if文の逆の意味を持ちます。
構文 | if ( 条件A ) { 実行A } elsif ( 条件B ) { 実行B } else { 実行C } |
内容 |
もし、「条件A」が真であるならば、「実行A」を実行する。 もし、「条件A」が偽で、「条件B」が真ならば、「実行B」を実行する。 もし、「条件A」「条件B」が偽であるならば、「実行C」を実行する。 |

1 | if ( $size eq "big" ) { print "大きい\n" ; } |
2 | elsif ( $size eq "middle" ) { print "中くらい\n" ; } |
3 | else { print "小さい\n" ; } |
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; |
2 | while ( $i > 0) { |
3 | print "カウントダウン : $i \n" ; |
4 | $i --; |
5 | } |
1 | > カウントダウン : 3 |
2 | > カウントダウン : 2 |
3 | > カウントダウン : 1 |
2. until文
untilは、whileと「条件」の評価が逆になるだけです。
1 | $i = 3; |
2 | until ( $i <= 0) { |
3 | print "カウントダウン : $i \n" ; |
4 | $i --; |
5 | } |
1 | > カウントダウン : 3 |
2 | > カウントダウン : 2 |
3 | > カウントダウン : 1 |
3. do {} while文
whileは、ブロック内を実行する前に、条件を評価することに対して、
do {} whileは、ブロック内を1度実行した後、条件を評価するところがwhileと異なります。
do {} whileは、ブロック内を1度実行した後、条件を評価するところがwhileと異なります。
1 | $i = 3; |
2 | do { |
3 | print "カウントダウン : $i \n" ; |
4 | $i --; |
5 | } |
6 | while ( $i > 0 ); |
1 | > カウントダウン : 3 |
2 | > カウントダウン : 2 |
3 | > カウントダウン : 1 |
4. do {} until文
do {} untilは、do {} whileと「条件」の評価が逆になるだけです。
1 | $i = 3; |
2 | do { |
3 | print "カウントダウン : $i \n" ; |
4 | $i --; |
5 | } |
6 | until ( $i <= 0 ); |
1 | > カウントダウン : 3 |
2 | > カウントダウン : 2 |
3 | > カウントダウン : 1 |
5. for文
1 | for ( $i = 3; $i > 0; $i -- ) { |
2 | print "カウントダウン : $i \n" ; |
3 | } |
1 | > カウントダウン : 3 |
2 | > カウントダウン : 2 |
3 | > カウントダウン : 1 |
6. foreach文
1 | foreach $i (3, 2, 1) { |
2 | print "カウントダウン : $i \n" ; |
3 | } |
1 | > カウントダウン : 3 |
2 | > カウントダウン : 2 |
3 | > カウントダウン : 1 |
5-4. ループ制御
前項のループ文の使用において、ループの流れを変えるために、次の3つの演算子が用意されています。
演算子 | 内容 |
---|---|
next | ループをスキップする |
last | ループを終了する |
redo | ループを先頭の位置まで戻してやり直す |
1. next演算子
1 | foreach $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演算子
1 | foreach $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; |
02 | foreach $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 |
5-5. 三項演算子
三項演算子とは、ifの条件式を短縮して(一行にして)表記する技法です。
覚えておくと、非常に便利な書き方です。
また、if ~ elsif ~ else 式の条件文も可能です。
覚えておくと、非常に便利な書き方です。
構文 |
---|
[条件式] ? [真のとき評価される式] : [偽のとき評価される式] |
1 | $age = 18; |
2 | print $age >= 20 ? "成人\n" : "未成年\n" ; |
1 | > 未成年 |
1 | $point = 82; |
2 | $result = |
3 | $point >= 90 ? '優' : |
4 | $point >= 80 ? '秀' : |
5 | $point >= 70 ? '可' : |
6 | '不可' ; |
7 |
8 | print "あなたの成績は$resultです。\n" ; |
1 | > あなたの成績は秀です。 |