どの言語でもそうですが、プログラムの実行は普通、あなたが書いた順に行われます。 ですが時には、ある条件に合っているかどうかで処理を分けたり、同じような処理を何度も繰り返したりしたくなります。 このような時に必要になるのがif文やfor文などです。 これらの条件分岐やループ制御をまとめて「制御構造」といいます。 この章ではこれらの制御構造について見て行きます。
if文やfor文は、ある条件を評価(チェック)して、それが真(正しい)ならばその後の処理を実行する、偽(正しくない)ならば別の処理を行う(あるいは何もしない)というような流れを持っています。 では与えられた条件が真か偽かをどうやって判定しているのでしょうか。 Perlでは、
という規則にしたがって真偽の判定が行われます。 ですから例えば、
"" → 空文字列だから偽
1 → 0ではないので真
0.0 → 0なので偽
"0.0" → ""でも"0"でもないので真
"can" → ""でも"0"でもないので真
ということになります。
実際のスクリプトでは、種々の演算子によって条件を判定しています。 これらの演算子には主に「比較演算子」と「論理演算子」とがあります。 どの演算子もよく使うものです。
使い方 | 処理 | |
---|---|---|
数値 | 文字列 | |
$a < $b | $a lt $b | $aが$bよりも小さければ真 |
$a <= $b | $a le $b | $aが$bよりも小さいか 等しければ真 |
$a > $b | $a gt $b | $aが$bよりも大きければ真 |
$a >= $b | $a ge $b | $aが$bよりも大きいか 等しければ真 |
$a == $b | $a eq $b | $aと$bが等しければ真 |
$a != $b | $a ne $b | $aと$bが等しくなければ真 | $a <=> $b | $a cmp $b | $aが$bより小さければ-1 $aが$bと等しければ0 $aが$bより大きければ1 |
比較演算子は、数値に対して使う場合と、文字列に対して使う場合で書き方が異なりますので注意してください。 例えば、
$a = "hogehoge";
if($a == 0){
print "ok";
} else {
print "ng";
}
としてしまうと、"ok"が出力されます。 これは==演算子が強制的に$aの値を数値に変換してしまうためです。
さて、2つ以上の条件について、両方とも真のときだけ処理をするという場合はどうすればいいでしょうか? このようなときには論理演算子を使います。
使い方 | 処理 | 論理的には… |
---|---|---|
a && b | aが偽ならばaの値 それ以外はbの値 |
aとbの両方が真のときだけ真 |
a || b | aが真ならばaの値 それ以外はbの値 |
aとbのどちらか一方が真ならば真 |
!a | aが真でなければ1 | aが真でなければ真 |
論理演算子は、なるべく少ない引数で真偽を判定するので短絡演算子ともよく言われます。 例えば&&演算子はまず、左引数を評価します。 左引数が真ならば、右引数の評価に移ります。 そして右引数も真のときだけ真(実際には右引数の値)を返します。 左引数が偽のときは、右引数を評価することなく偽(実際には左引数の値)を返します。 右引数の真偽にかかわらず結果は偽になるからです。 例えば、
$a = 6;
$result = ($a > 0) && ($a < 10);
とすると、まず$a > 0が評価されます。 $aの値は6なので真、よって次の$a < 10が評価されます。 これも真なので$resultには1がセットされます。
また||演算子はまず左引数を評価して、それが真ならば右引数を評価せずに真(実際には左引数の値)を返します。 左引数が偽ならば、右引数を評価して、それが真ならば真(右引数の値)を返します。 例えば、
$a = 6;
$result = $b || $a;
とするとまず$bが評価されます。 $bは未定義なので偽です。 そこで右引数の$aを評価します。 $aは6なので真となり、$resultには6が代入されます。
比較演算子と論理演算子はこれからしょっちゅう出てきます。 この章を通じてゆっくり理解していってください。 次の節では条件分岐について見て行きます。