第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";
> あなたの成績は秀です。
Perl tutorial: A basic program

powered by
Profile

