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