Study 1 if文

プログラムを組む上でいわゆる「流れ制御文」と呼ばれるものがあります。
これはif文やfor文while文など一連をさし、今回はその中でも最もポピュラーなif文を取り上げたいと思います。

まず基本的なif文です。

$a = 1;
if ($a == 1) { print 'Missing Link' }
elsif ($a == 2) { print 'ミッシングリンク' }
else { print 'ミッションインポシブル' }

まず変数$a に 1を代入します。
次が一般的なif文です。
三つあるif文の一番最初、$aが1だったらMissing Linkと表示しなさいという命令です。
次の行は「そうでなくて$aが2だったら」。
最後が「それ以外」です。
$a == 1のイコールが2つあるというところに注意して下さい。
これは比較演算子と呼ばれるもので「イコールならば」という意味になります。
イコールが1つだと1行目の右辺を左辺に代入するという意味になります。
ちなみに比較演算子には以下のようなものが用意されています。一般的なものをご紹介します。

数値に使用するもの
== 等しい
>  大きい
<  小さい
>= 以上(=> これは誤り)
<= 以下(=< これは誤り)
!= 等しくない(<> これは誤り)

文に使用するもの
eq 等しい(数値に使用しても間違いではない)
ne 等しくない(数値に使用しても間違いではない)

次の例を見てみましょう。

$a = 1;
if ($a) { print 'Missing Link' }

これはさっきと2行目の記述方法が異なります。
$a == 1 が単なる$aになっています。何が違うのでしょうか?

日本語的に解釈すると$aならばということですが、これは$aが真ならばという意味になります。 では何が真なのでしょうか。Perlの場合、0でないもの、未定義でないもの、何かデータが入っているものを真と呼びます。 0でないものというのはわかりますね。1もそうですし、-1も真になります。

未定義とはなんでしょう。1行目で$aに1という数字を入れました。これで$aは1ですと定義したことになります。 もし1行目がなく、いきなり2行目から始まった場合、$aの値は未定義値になりますので、偽になります。 何かデータが入っているものというのはその意味通りです。ただし0は偽なので、何かには含まれません。 例文の場合、$aは1なので当然Missing Linkと表示されることになります。

次の例を見てみましょう。

$a = 1;
if (!$a) { print 'Missing Link' }

先ほどの例文と1箇所だけ違うところがあります。お気づきでしょうか?
$aの前に!がありますね。別に何かに驚いているわけではありません。
これは日本語で言うと$aじゃなかったらということになります。
すなわち$aが真では無い場合という意味です。
真では無いもの、つまり0か、未定義か、何もデータが入っていない状態です。
先ほどと全く逆のパターンですね。
例文の場合、$aは1なのでこの条件には当てはまらず、結果Missing Linkも表示されません。

次の例を見てみましょう。

$a = 1;
unless ($a) { print 'Missing Link' }

次はifではなくunlessという構文が出てきました。
これはifの全く逆で「なになにで無い場合」という意味です。
例文を解釈しますと$aで無い場合($aが偽である場合)という意味になります。
なんてことはない、先ほどの例文と全く同じ意味です。
もし$aの前に先ほどの!を加えたらどうなるか。
その場合は、$aじゃなかったらじゃなかったらという意味ではっきり言って訳分かりません。
つまりunlessはかなりややこしく、プログラマー自身も混乱しかねないので、
余程のことが無い限りこのunless文はあまり使われません。
まあ、こういうのもあるんだと知っておくくらいでいいでしょう。

次の例を見てみましょう。

$a = 1;
print 'Missing Link' if $a;

これはなんでしょうか。これも立派なif文です。
後付けと私が勝手に呼んでいるスタイルです。要はifを後ろに持ってきただけですね。
今までのが日本語的表現だとするとこちらは英語的な表現です。
かっこもいらないので、非常にすっきりした感じになります。
ただこれの欠点はelse文などを追加できないところです。

更に見てみましょう。

$a = 1;
{
    print ('Missing Link'),last if $a;
    print ('ミッシングリンク'),last if !$a;
}

こうなってくるとよくわかりませんね。これはまず全体をブロックで囲んでいます。
{}がブロックです。まあエリアと呼んでもいいでしょう。
ブロックの中の1行目、$aが真ならMissing Linkとして表示してlastしろとなります。
間にカンマが入っていますが、これは別々の2つの文をつなげる意味があります。
lastというのはまあ直訳すると「これで最後にしろ」ということですが、要は「ここで終わってブロックを抜けろ」という意味です。
例文の場合、$aは真(1は真だから)なのでMissing Linkと表示してこのブロックを抜けます。2つ目の文は実行されません。
逆に$aが0だった場合、2つ目の式が実行され(ミッシングリンクと表示され)ブロックを抜けます。
なんで、こんな訳の分からない記述方法をするかというと、もし条件が沢山あった場合、こういう記述の方が見やすくなる場合があるからです。
ただ、この方法もあまりポピュラーとは言えません。

更に見てみましょう。

$a = 1;
$a && print 'Missing Link';

これももはや普通の英文で解釈するのは困難な例文です。なんでしょうか、これは。
$a と &&と print文がありますね。
これはまず左の$aから解釈していきます。
$aは1が入っているので真です。
するとプログラム的には$aが真なので、その右を解釈しようとします。
&&はperlで「かつ」という意味ですが、英語で言うと「and」、さらに噛み砕いて言うと「左が真だったら右の文を解釈しろ」という意味になります。
ちょっと分かりづらいですね。でもこれは

if ($a) { print 'Missing Link' }

と全く同じ意味なのです。
これと逆の表現をする場合は以下のようになります。

$a || print 'Missing Link';

||は&&の全く逆の意味で、「もしくは」、英語だと「or」という意味です。
$aもしくはMissing Linkを表示しろですね。
これを更に噛み砕いて言うと、$aが真もしくはMissing Linkを表示しろ。
更に噛み砕いて言うと、$aが真じゃないならMissing Linkを表示しろということになります。

次にこれを発展させた例を見てみましょう。

$a ||= 'Missing Link';

上と少し似ていますが、print文を使用していません。printさせるのではなく、$aにMissing Linkを代入する命令文です。 ||=というのは「〜でなければ代入せよ」という命令文です。この場合は$aで無ければ、つまり $aに0以外の何かが入っていなければ代入せよという意味です。下の構文と同じ意味です。

if (!$a) { $a = 'Missing Link'; }

||=と全く逆の命令文が&&=です。

$a &&= 'Missing Link';

$aに何か入っていれば代わりにMissing Linkという文字列を代入しろということですね。

最後に条件演算子というものを見てみましょう。なかなか便利な代物です。

$a = $a ? 'Missing Link' : 'Nothing';

「?」が if(もしも)に該当します。
「:」が else(でなかったら)に該当します。
日本語解説付きでもう一度見てみましょう。

$a =  $a      ?      'Missing Link'      :    'Nothing';
$a は $aは真か? 真ならMissing Linkを代入 偽ならNothingを代入

なんとなくお分かり頂けると思います。
この条件演算子は「?」も「:」も半角一文字なので文が短く見やすくなります。
ただし条件演算子は必ず〜でなかったらの記述が必要になります。
以下のような記述だとエラーになります。

$a = $a ? 'Missing Link';

条件演算子は分岐(〜でなかったら)を幾つでも増やす事が可能です。

$a = $a == 1 ? '1号店' : $a == 2 ? '2号店' : '3号店';

$aが1だったら1号店を、そうではなく2だったら2号店を、更にそうではなかったら3号店を代入します。注意しなくてはならないのはそれ以外のどれにも当てはまらなかったらという条件を最後に必ず記述するという事です。

戻るstudy2


Copyright 2000-2003 Missing Link All Rights Reserved.