第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」を実行する。
コード例
if ($size eq "big") { print "大きい\n"; }
elsif ($size eq "middle") { print "中くらい\n"; }
else { 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文
$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と異なります。
$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
pagetop

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
pagetop

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";
>  あなたの成績は秀です。
pagetop