2011年10月25日
これがlivedoor社員のやり方か!!!
2009年08月27日
if文 続きの続き
お前の血は何色だ、こんばんはugnewsです。
こないだのif文がまだちょっと残っていたのでそれやった。マニュアル人間だし、本通りにやっていかないと不安だ!!
まずは、数の比較と文字列の比較。文字として比較するか、数として比較するか。12と9の場合、数としてみれば12の方がそりゃ大きいけど、文字列で見ると9の方が大きいとみなされる。理由は、12の最初の1が「1」として解釈されてしまうから。まあ数と文字列の比較演算子の表はこことか見てください。
こういうのを書いた。
my $a = 12;
my $b = 9;
# その1
if ($a > $b) {
print "$a > $b\n";
} else {
print "$a le $b\n";
}
# その2
if ($a gt $b) {
print "$a gt $b\n";
} else {
print "$a le $b\n";
}
gt というのは、$aが$bより大きい場合が真になる条件式。実行するとこうなる。
12 > 9
12 le 9
「その1」の方が、真の方の結果で出るのはそのまんまだけど「12 > 9」だから。「その2」の方は、説明したとおり、1として解釈されちゃってるから「1 > 9」となるわけ。で、9の方が大きいわけで偽の方の $a le $b が実行結果に表示される。
次は、数が入力されたのか判断するプログラム。
my $line = <STDIN>; # ユーザ入力
chomp($line); # 改行を取り除く
if ($line =~ /^\d+$/) { # 文字列?
print "$lineは数字列だ!!\n"; # はい!!
} else {
print "$lineは文字列ではない!!\n"; # いいえ
}
実行すると、こんな感じになる。
1111
1111は数字列だ!!
数字以外を入力すると、
unko
unkoは文字列ではない!!
と出る。条件式に書かれてる $line =~ /^\d+$/ というのは、なんか色々書かれてる。めんどせえ。なんか「この式の詳しい意味は第7章で学びます」とか書かれてるし。まだ第3章なので詳しいことはいずれ書くと思います。
オマケ ~デバッグプリントの制御~
if文を使ってデバッグプリントの有無を切り替えられるようにするには、
my $debug = "1";
if ($debug) {
print "うんこうんこ\n";
print "うんこうんこ\n";
}
あるいは、
print "うんこうんこ\n" if ($debug);
とif修飾子モードで書いてみると
うんこうんこ
うんこうんこ
と出ます。大便が爆発する。で、この $debug の値を0にするとデバッグプリントを無効にできる。これは便利のような気もするけど、どういうときに使えばいいのかちょっとピンとこないなー。たまたま書いてたプログラムを実行したときにエラーが出た場合、この値を0にしておくと間違ってる部分を探しやすくなる!とかそんなんでいいのかな。でも、それだといちいち print があるところはif文で括っておかなきゃダメなんじゃないのか。うーむ。
ひとまずここまで。このプログラムを書いて、それをこうしてブログに書くまでに1時間かかった…。
次は第4章「配列とリスト」をやるよ。
2009年08月24日
if文 続き
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 =
もう一つ、違った例を。これは正しい番号を入力したら褒められるというクズ☆プログラムです。
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文の勉強はこのくらいで。
分かる人は読んでてピクピクしまくりだと思うけど、けっこう間違ってるところがありそう。つか、今日学んだことを読者向けに解説するスタイルを取ってる時点でまずムリがあるんだけど、まあただ書いたコードと実行結果を張るだけでもつまらんしなあ。それに、こうして解説になってない解説を書けるのも、ある程度は理解できてるという証明でもあるしねえ。正直、このエントリー書くのにやばいぐらい時間かかってるんだけど、こういうことはおそらくムダになってないはず(;´Д`)まあ何事も最初は時間がかかるもんだよな、前向きにこの調子でいこう。