www.ugnews.info

if文

NTEmacsの設定がうまくできなくて断念した。こんばんはugnewsです。
今日はプログラミングには欠かせない(?)らしいif文を学んだよ。

ifってのは、「もしも〜なんとかならば〜」という文章をプログラムで表現できる。
まず最初に、数字が7よりも大きかったら「おはよう、お兄ちゃん♪」と表示するプログラムを書いてみた。

my $number = "7";
if ($number < 8) {
	print "1おはよう、お兄ちゃん♪\n";
}

if ($number < 7) {
	print "2おはよう、お兄ちゃん♪\n";
}

これを実行すると、

1おはよう、お兄ちゃん♪

ってなる。このコードの中にある ($number < 8) ってのはなにか。$numberには7ってのが入ってる。つまり (7 < 8) ってことで、この場合は$numberが8より小さいなら真、それ以外なら偽ということになる。だから、その条件をクリアしている「1おはよう、お兄ちゃん♪」が実行結果として表示されるわけ。逆に、「2おはよう、お兄ちゃん♪」が表示されない理由は、$numberが7と同じ大きさだから。まーここは何回か書いててようやく理解した。

こういう構造をしてる。

if (条件式 ) {
条件式が真のときの処理
}


逆にしてみようか。

my $number2 = "7";
if ($number2 > 6) {
	print "3おはよう、お兄ちゃん♪\n";
}

if ($number2 > 7) {
	print "4おはよう、お兄ちゃん♪\n";
}

実行すると、

3おはよう、お兄ちゃん♪

になる。($number2 > 6) ってのは$number2が6より大きいと真、それ以外なら偽となる条件式。「4おはよう、お兄ちゃん♪」が表示されない理由はまあいいだろ。


―――――――――――――――――――――


ちなみに、{}の中にはいくつでも文章を書ける。

if ($number < 8) {
	print "おはよう、お兄ちゃん♪\n";
	print "あたしの年は$numberだよ。\n";
	print "悪魔主義者は何かを追及する哲学者だと言える。\n"
}

実行してみる。

おはよう、お兄ちゃん♪
あたしの年は7だよ。
悪魔主義者は何かを追及する哲学者だと言える。


―――――――――――――――――――――


今、あれこれ書いてきたのはif文っていう。この他にも「if修飾子」ってのがある。

これがif文。

my $if = "1";
if ($if == 1) {
	print "おはよう、死ぬ\n";
}

これがif修飾子。

my $if = "1";
print "おはよう、死ぬ\n" if ($if == 1);

見た目はちょっと違うけど、実行結果はどちらも

おはよう、死ぬ

になる。つまり、動作そのものに差はなくて、単純に「人間」が読みやすさの差がでるだけ。…のはずなんだけど、使い方によってはif文の方が優れてる、とかいうケースもあるんだけど、書くのは省略。

ちなみに、この条件式 ($if == 1) はどういう意味かというと、 (1 == 1) ってな感じで、同じ数の場合のみ「おはよう、死ぬ」という文字を表示させるようにしてるんですね。


―――――――――――――――――――――


次はif-else文。これを使うと、条件式が真になるときと偽になるときとで違った実行結果を出してくれる。

my $hour = "7";
if ($hour < 8) {		# その1
	print "おはよう。\n";
	print "今は", "$hour", "時だ…。\n\n";
} else {
	print "こんにちは。\n";
	print "悪魔の再生こそが唯一の終着点だ。\n\n";
}

if ($hour < 6) {		# その2
	print "ブラック・メタルは白人のためのものだ…。\n\n";
} else {
	print "キリスト教は打倒すべき宗教だ…。\n\n"
}

これを実行すると、

おはよう。
今は7時だ…。

キリスト教は打倒すべき宗教だ…。

って出る。「その1」は、まあ$hourの値が8より小さいから(これが真)、「おはよう。今は7時だ…。」と実行結果が出る。

「その2」は、$hourの値が6より大きいから(つまり偽)、「ブラック・メタルは白人のためのものだ…。」が実行結果として表示されず、もう片方の「キリスト教は打倒すべき宗教だ…。」が表示される。こうしてelseを書いておくと、必ずどちらかが処理されるんだわー。

あー、共通な処理はif-elseの外に出しておいたほうがいいかも。

my $unko = "5";
if ($unko < 6) {
	print "死にてー(笑)\n";
} else {
	print "精神が崩壊する\n";
}
print "今は", "$unko", "時です。\n\n";

「死にてー(笑)」と「精神が崩壊する」はどちらかしか表示されないけど、

死にてー(笑)
今は5時です。

の「今は5時です。」はどっちの処理でも出るので、こうやって書くこともできるわけだ。


―――――――――――――――――――――


次は、if-else-elsif文。if-else文だと、2つの処理から1つを選ぶってのだったけど、複数の処理から1つを選べるのがこのif-else-elsif文だ。

my $hour = "1";
if ($hour < 8) {
	print "おはようハゲ\n";
} elsif ($hour < 12) {
	print "こんにちはハゲ\n";
} elsif ($hour == 12) {
	print "腹減ったハゲ\n";
} elsif ($hour < 17) {
	print "こ〜んにちはハゲ\n";
} else {			# それ以外
	print "死にてえ\n";
}
print "今の時間は", "$hour", "です。\n\n";

実行すると

おはようハゲ
今の時間は1です。

実行結果がヘンな日本で出てきたけど、これで合ってます。$hourの値を11にすると「こんにちはハゲ」って出るし、値を12にすれば「腹減ったハゲ」になる。17以上の値にすると、elseの中に入ってる「死にてえ」が表示される。

if文って面白いね、というかやっとプログラミングをやってるって気になってきた。いいことですね。


―――――――――――――――――――――


演算子and〜
andを使うと、複数の条件をまとめて「かつ」を表現できる。

my $sperma = "14";
if (9 <= $sperma and $sperma <= 17) {
	print "もう俺のライフポイントはゼロだ";
}

実行するまでもないけど。

もう俺のライフポイントはゼロだ

9以上かつ17以下のときにprintに入ってるヤツを表示する。


―――――――――――――――――――――


演算子or〜
orを使うと、複数の条件をまとめて「または」を表現できる。

my $slayer = "5";		# その1
if ($slayer == 5 or $slayer == 8) {
	print "My life is 糞";
}

print "\n";

my $unko = "11";		# その2
if ($unko == 12 or $unko == 15) {
	print "腹が減って死ぬ";
} else {
	print "もうだメタリカ";
}

実行すると、

My life is 糞
もうだメタリカ

「その1」の場合、変数の値が5、または8である場合に、「My life is 糞」と表示させる。「その2」、これってelseももちろん使えるよなーと本に書いてないけど勘でやったらしっかり出来た。こうやって自分からあれこれやるのは大事ですね。この条件式は偽になるので「もうだメタリカ」が表示される。


―――――――――――――――――――――


if文でちょっとしたものでも作ってみた。

これは、ユーザが入力した数に応じたメッセージ表示させるプログラム。自動販売機風味。

print "飲み物を選べ\n";
print "1 = レッドブル\n";
print "2 = ラーメン二郎@品川店のスープ\n";
print "3 = マックスコーヒー\n";
my $line = <STDIN>;
if ($line == 1) {
	print "レッドブル\n";
} elsif ($line == 2) {
	print "ラーメン二郎@品川店のスープ\n";
} elsif ($line == 3) {
	print "マックスコーヒー\n";
} else {
	print "何もねーよ\n";
	exit; # プログラムを終了させる
}	

実行すると、

飲み物を選べ
1 = レッドブル
2 = ラーメン二郎@品川店のスープ
3 = マックスコーヒー
1
レッドブル

とか

飲み物を選べ
1 = レッドブル
2 = ラーメン二郎@品川店のスープ
3 = マックスコーヒー
2
ラーメン二郎@品川店のスープ

ってな感じで、自分で入力した数字に応じて表示される。

ここで書かれてる my $line = ; は、「ユーザーが入力した1行の文字列を変数$lineに代入する」という意味がある。


もう一つ、違った例を。これは正しい番号を入力したら褒められるというクズ☆プログラムです。

print "暗証番号を入れてね☆";
my $line = <STDIN>;	
chomp($line);				# 改行を取り除く
if ($line eq "0123") {			# 正しい暗証番号か
	print "クールな番号だ。\n";	# 正しいとこうなる
} else {
	print "その番号はゲイだよ。\n";	# 違うとこうなる
}

正しい番号を入力すると、

暗証番号を入れてね☆0123
クールな番号だ。

って出るし、違った番号を入れると、

暗証番号を入れてね☆0000
その番号はゲイだよ。

と出る。

この chomp($line); は、もう書いてあるけど「変数$lineの最後の改行を取り除く」という意味がある。

で、正しい番号かどうかの判断は $line eq "0123" という条件式でやってる。この eq ってのは、両辺を文字列として比較し、等しかったら真になるという演算子。まあ == と似てる。ちなみに、この場合だと == でもちゃんと同じ結果になるんだけど、これもまた微妙に違うらしい。


―――――――――――――――――――――


オマケ 〜unless文について〜
if文は「もしも〜なんとかならば〜」というのを表現するヤツだったけど、unless文は「もしも〜じゃなかったら」を表現できる。

まあこんな感じです。

my $money = "12";
unless ($money < 12) {
	print "おおおおお昼じゃねーよ\n";
}

これを実行すると、

おおおおお昼じゃねーよ

あーなんかどうしてこうなるかは感覚で分かるんだけど、うまく言語化できないのでパス。それじゃダメだ…。


―――――――――――――――――――――


すごく長くなってしまったけど、if文の勉強はこのくらいで。

分かる人は読んでてピクピクしまくりだと思うけど、けっこう間違ってるところがありそう。つか、今日学んだことを読者向けに解説するスタイルを取ってる時点でまずムリがあるんだけど、まあただ書いたコードと実行結果を張るだけでもつまらんしなあ。それに、こうして解説になってない解説を書けるのも、ある程度は理解できてるという証明でもあるしねえ。正直、このエントリー書くのにやばいぐらい時間かかってるんだけど、こういうことはおそらくムダになってないはず(;´Д`)まあ何事も最初は時間がかかるもんだよな、前向きにこの調子でいこう。