if文制御
プログラムの分岐
これまでのプログラムは全て上から下へ忠実に実行されました
しかし、たとえば入力された値によってプログラムを分岐させたい時などがあります
そのような時に制御文を用いてプログラムを分岐させます
ここでは制御文の中でも特に代表的なif文を覚えましょう
if (expression) {
statements
}
if は () の中にかかれてある条件が成立した場合に
{ } の中を実行するという仕組みになっています。
expressionには条件式と呼ばれるifの判断材料を書きます
条件式は比較する二つの式を等価比較演算子で比較します
if ($a == 5+6)
上の条件式の場合は$aと5+6(すなわち11)が等しければという意味になります
では、二つの数を入力して、それが等しいかどうか判断するプログラムを作成してみましょう
print "最初の数を入力してください\n";
$var1 = <STDIN>;
print "比較する数を代入してください\n";
$var2 = <STDIN>;
if ($var1 == $var2) {
print '$var1と$var2は等しいです';
}
if ($var1 != $var2) {
print '$var1と$var2は等しくありません';
}
文字を代入するとおかしな結果になります
このプログラムで扱えるのは数だけですが、ユーザーに数を入力させてそれを判定します
条件に合った結果を出すというのは、なんだか動的でプログラムらしくなってきましたね
条件式の等価比較演算子については「演算子一覧」をごらん下さい
しかし、このプログラムではそうでなければ・・・しなさいという処理ができませんね
実はifで条件が満たされなかった場合の処理を担当する専用の命令があります
それがelse命令です
elseはif文で条件が合わなかったときに、指定ステートメントを実行します
また、elsifというステートメントも存在します
elsif (expression) {
statements
}
これはif文で条件が合わなかったときに、別の条件式を試したい時に使います
print "最初の数を入力してください\n";
$var1 = <STDIN>;
print "比較する数を入力してください\n";
$var2 = <STDIN>;
chomp($var1,$var2);
if ( $var1 == $var2) {
print "$var1と$var2は等しいです";
}
elsif ($var1 > $var2) {
print "$var1は$var2より大きいです";
}
else {
print "$var1は$var2より小さいです";
}
elsifを使わずとも、else { if() { statements } else…… とネストできますが
これではソースが複雑になり不要なエラーを続発させる可能性が高いです
print "最初の数を入力してください\n";
$var1 = <STDIN>;
print "比較する数を入力してください\n";
$var2 = <STDIN>;
chomp($var1,$var2);
if ( $var1 == $var2) {
print "$var1と$var2は等しいです";
}
else {
if ($var1 > $var2) {
print "$var1は$var2より大きいです";
}
else {
print "$var1は$var2より小さいです";
}
}
どうですか、elsifを使った前者の方が比較的すっきりしていると思います
ましてこれが、より複雑な分岐になった場合はelsifのほうが便利だということは言うまでもありません
unlessを使う
ifと対照的な、あべこべの制御文が存在します
unlessステートメントと言い、ifとは反対に条件式があわなければステートメントを実行します
つまり、以下はまったく同じことであるということです
if ($a == 1) と unless ($a != 1)
どちらを使っても結果は同じですが、他の言語との互換性も考えるとunlessの多用は避けたいです
print "最初の数を入力してください\n";
$var1 = <STDIN>;
print "比較する数を入力してください\n";
$var2 = <STDIN>;
chomp($var1,$var2);
unless ( $var1 != $var2) {
print "$var1と$var2は等しいです";
}
elsif ($var1 > $var2) {
print "$var1は$var2より大きいです";
}
else {
print "$var1は$var2より小さいです";
}
分岐と言っても書き方は複数あり、それはプログラマによって異なります
ひとつのやり方だけ知っていれば事足りますが、それではまれに他人が書いたソースを解読できなくなります
少なくとも記述方法と意味だけは知っておきましょう
?演算子による二者択一
もし評価したい内容が「真」か「偽」かのみで、処理内容も一行単体ならば?演算子を用います
内容はifに類似していますが、処理内容が簡素ならば?演算子のほうがシンプルにまとめられます
条件式 ? 真の処理 : 偽の処理
ただしあまり長くなるような処理には使いません.逆に読みづらくなります
ifを使うほど複雑にはならないようなif 〜 else的な処理に適しています
print "最初の数を入力してください\n";
$int1 = <STDIN>;
print "比較する数を入力してください\n";
$int2 = <STDIN>;
chomp($int1 , $int2);
($int1 == $int2) ? print "$int1と$int2は等しいです" : print "$int1と$int2は等しくありません";
最後の ($int1 == $int2) ? … がそうですね
でも、これは少し長いですね、最後の行は以下のようにまとめることができます
print (($int1 == $int2) ? "$int1と$int2は等しいです" : "$int1と$int2は等しくありません");
二度もprintを書くよりは、このようにまとめたほうが見やすいです
Perl言語は同じ結果を得るのにも、複数の選択偽があるのでいろいろ考えて試してください
ifステートメント
if (expression) {
statements
} [elsif (expression) {
statements
} else {
statements
}]
elsif以降は省略可能。条件によってプログラムを分岐させます
各expressionには条件式を書きます
statementsには条件が真だった時に実行させるプログラムを記述します
unless (expression) { statements }
条件がFlase(偽)だったときにステートメントを実行します
expressionには条件式を書きます
statementsには条件が偽だった時に実行させるプログラムを記述します