Search A.I.
Menu
ホーム

メールマガジン ホームページプログラミングテク

Windowsテク
Javaアプレット サンプル
Java Q & A
JavaScript Q & A
Perl Q & A
Perl レッスン
PHP レッスン
PHPテク
MS-DOS コマンド集
UNIX コマンド集
SQL コマンド集
SEの基礎講座
WEBシステム開発受注します
]無料フォームメール送信サービス
リンク集
Perl レッスン

1. Perl の基礎
2. Perlの文法、条件式
3. Perlの文法、条件式 - 続き
4. 配列について
5. ハッシュ配列について
6. Perlの基礎 - 続き
7. 関数について
8. 関数について - 続き
9. 文字列操作関数
10. 配列操作関数
11. ファイル操作
12. ファイル操作 - 続き
13. パラメータの受け渡し
14. クッキーについて
15. 総合練習
16. メール送信
17. ファイルアップロード
18. パッケージの使用方法
19. MySQL
20. MySQL - 続き(1)
21. MySQL - 続き(2)
22. PostgreSQL
23. 総合練習
24. 総合練習解答



3. Perlの文法、条件式 - 続き

今日は、前回のPerlの文法、条件式の補足を行います。

■条件式について
いろいろな条件式をご紹介します。

-----------------------------------------------------------------
$a = 5;
if ($a == 5) { # 真
if ($a != 5) { # 偽
if ($a < 5) { # 偽
if ($a <= 5) { # 真
if ($a >= 5) { # 真
if ($a > 5) { # 偽
if (!($a == 5)) { # 偽
-----------------------------------------------------------------

<= 、 >= はそれぞれ「以下」、「以上」ですので、上のサンプルの場合、
$a <= 5
$a >= 5
は真となります。

< 、 > はそれぞれ「より小さい」、「より大きい」ですので、上のサンプルの
場合、
$a < 5
$a > 5
は偽となります。

== は「等しい」、 != は「等しくない」ですので、上のサンプルの場合、
$a == 5
は真、
$a != 5
は偽となります。

! は否定です。真を偽に、偽を真にしますので、上のサンプルの場合、
$a == 5
は真ですので、
!($a == 5)
は偽となります。

次に複数の条件式の書き方をご紹介します。

-----------------------------------------------------------------
$a = 5;
$b = 6;

if ($a == 5 && $b == 6) { # 真かつ真なので、真
if ($a == 5 && $b < 6) { # 真かつ偽なので、偽
if ($a != 5 && $b < 6) { # 偽かつ偽なので、偽

if ($a == 5 || $b == 6) { # 真または真なので、真
if ($a == 5 || $b < 6) { # 真または偽なので、真
if ($a != 5 || $b < 6) { # 偽または偽なので、偽

-----------------------------------------------------------------

&& (かつ)と || (または)の違いは、左と右の条件式が、真と偽だった場合の
結果が異なります。上のサンプルのように、
$a == 5 && $b < 6
は偽となりますが、
$a == 5 || $b < 6
は真となります。

|| 「または」の場合は、どちらか一方でも真の場合は真、
&& 「かつ」の場合は、両方 真の場合だけ真
と覚えておくとよいでしょう。

■文字列比較について
今度は、変数の値が整数ではなく、文字列の場合をご紹介します。

-----------------------------------------------------------------
$a = "abc";
if ($a eq "abc") { # 真
if ($a ne "abc") { # 偽
if ($a lt "abc") { # 偽
if ($a le "abc") { # 真
if ($a gt "abc") { # 偽
if ($a ge "abc") { # 真
if (!($a eq "abc") { # 偽
-----------------------------------------------------------------

こちらは整数の場合と同じなのですが、条件式の書き方が異なります。

前回ご紹介したとおり、

eq 文字列比較 - 等しい ( equal イコール )
ne 文字列比較 - 等しくない ( not equal ノットイコール )
lt 文字列比較 - より小さい ( less than レスザン )
gt 文字列比較 - より大きい ( greater than グレーターザン )
le 文字列比較 - 以下 ( less than or equal レスザンまたはイコール )
ge 文字列比較 - 以上 ( greater than or equal グレーターザンまたはイコール )

となっています。

ここで、文字列の場合で、「以下」とか「より大きい」とはどういうことかを
簡単にご説明します。

1つ1つの文字には、文字コードというものを持っています。
これは、コンピュータが、文字を形として理解しているのではなく、デジタルの
信号(数字と思っていただいて結構です)として扱っているためです。

例えば、アルファベットの場合、

a : 0x61
b : 0x62
c : 0x63
:
:

というような16進数のASCIIコードで扱われています。

この辺のコードの詳細については、別の機会にしたいと思いますが、
文字列比較では、このコードが大きいか小さいかで判定されます。

例えば

-----------------------------------------------------------------
$a = "abc";
if ($a lt "def") { # 真
if ($a le "def") { # 真
if ($a gt "def") { # 偽
if ($a ge "def") { # 偽
-----------------------------------------------------------------

となります。記号を置き換えると
"abc" <= "def"
は真という感じです。

ただ、
比較文字列が"abd"の場合は?
比較文字列が"ab"の場合は?
など、いろいろと出てくると思います。

この辺りは、説明が結構大変になるので、自分で試していただければと思います。

ただ、1つ言えるのは、文字列の比較を実際のプログラミングで使用するのは、
日付文字列の比較ぐらいですので、それほど追及しなくてもよいと思います。

■if文について
if文の別の書き方をご紹介します。

(条件式)? 条件が真のとき:条件が偽のとき

これだけで、条件式を判定して真の場合と偽の場合を書くことができます。

-----------------------------------------------------------------
$a = 5;
($a == 5)? print "True": print "False";
-----------------------------------------------------------------

上のサンプルの場合、条件式が真なら"True"を出力、偽なら"False"を出力して
います。

条件式と、その処理が簡単に書ける場合に使用するとよいですが、複雑な場合で
この書き方だと、後で見るときに分かりにくいので注意しましょう。

■ループ処理について
ループ処理には、for文、foreach文、while文、until文、do - until文がある
ことをご紹介しました。

ここでは、それぞれの書き方についておさらいしておきます。

以下のサンプルは、すべて同じループになります。

-----------------------------------------------------------------
@ary = (0, 1, 2, 3, 4, 5, 6, 7, 8, 9);

for ($i = 0; $i <= $#ary; $i++) {
print $ary[$i];
}

foreach (@ary) {
print $_;
}

$i = 0;
while ($i <= $#ary) {
print $ary[$i++];
}

$i = 0;
until ($i > $#ary) {
print $ary[$i++];
}

$i = 0;
do {
print $ary[$i++];
} until ($i > $#ary);

-----------------------------------------------------------------

上のサンプルで、forの場合は、
for (初期値; 条件文; 増分)
と、初期値、条件文、増分が書けますので、すっきりまとまっています。

さらに、foreach文は、配列の中身を取り出すためのループですので、さらに
すっきりまとまっています。

while文は、ループ前に初期値、ループの中で増分を書く必要があります。
until文やdo - until文も同様です。

どのループの場合も、forやwhileなどどれを使っても書けることは書けますが、
どれが最も適切かを判断し、処理に無駄がないように気を付けます。

まとめますと、for文は、初期値や増分がはっきりと決まっているループで
使用し、foreach文は、配列の中身を1つずつ取り出す時に使用し、while文は
初期値や増分が特にない場合になどに使用します。

until文やdo - until文はあまり使いませんが、必要になる場合があるかもしれない
ので、覚えておくとよいと思います。

■その他補足
条件文は、必ずしも比較の式でなくても構いません。
条件文の記述で以下のような書き方もできます。

-----------------------------------------------------------------
if (0) {
# この行は実行されません。
}
if (1) {
# この行は必ず実行されます。
}

$a = 5;
if ($a) {
# $aが0でなければ実行されます。
}
if (!$a) {
# $aが0の場合に実行されます。
}

$a = "abc";
if ($a) {
# $aが空文字でなければ実行されます。
}

for ($i = 0; 1; $i++) {
# 無限ループになります。
}

while (1) {
# 無限ループになります。
}

while (0) {
# ループには入りません。
}

-----------------------------------------------------------------

上のサンプルのように、
if (0)
と書くと、{ }の中は実行されません。
複数行をコメントアウトしたい時に便利です。

また、
if ($a)
とした時、$aが 0 以外だったら、{ }の中が実行されます。
$aが 0 の場合、0 は偽と同じ扱いですので、実行されません。
$aに何も入っていない場合も偽となります。

if ($a)
で$aが文字列の場合、$aが空文字でなければ{ }の中が実行されます。

ループの条件式が 1 となっていた場合、
for ($i = 0; 1; $i++)
while (1)
このような場合は、無限ループとなるので、注意してください。

まとめると、条件文の値が、0 や空の場合は、偽となり、なんらかの文字が
入っていれば、真という扱いになります。

 

★今日のまとめサンプルプログラム
-----------------------------------------------------------------
#! /usr/local/bin/perl

print "Content-type:text/html\n\n";

print << "END_OF_HTML";
<HTML>
<BODY>
END_OF_HTML

# if文の判定
$a = 5;
$b = "abc";

if ($a == 5 && $b le "def") {
# 真かつ真なので真
print "True<br>";
}
else {
print "False<br>";
}

if (!$a || $b eq "def") {
print "True<br>";
}
else {
# 偽または偽なので偽
print "False<br>";
}

if ($a < 5 && !$b) {
print "True<br>";
}
else {
# 真かつ偽なので偽
print "False<br>";
}

if ($a != 5 || $b ne "def") {
# 偽または真なので真
print "True<br>";
}
else {
print "False<br>";
}

print "<br>";

# ループ
@ary = (0, 1, 2, 3, 4, 5, 6, 7, 8, 9);

for ($i = 4; $i <= 6; $i++) {
# 4〜6までを表示
print $ary[$i] . "<br>";
}
print "<br>";

for ($i = 0; $i <= 9; $i += 2) {
# 増分を2にして、1つ飛ばしのループ
print $ary[$i] . "<br>";
}
print "<br>";

$i = 0;
while ($i <= $#ary) {
print $ary[$i] . "/";
print $#ary . "<br>";
$i++;
}
print "<br>";

while (0) {
# ループに入らない
print "TEST";
}

print << "END_OF_HTML";
</BODY>
</HTML>

END_OF_HTML

exit;
-----------------------------------------------------------------

■解説
上のサンプルプログラムを実際に動かしてみてください。
出力結果がどうしてそうなるのかを考えてみてください。

ちなみに、配列の添え字は 0 から始まりますので、上のサンプルの場合、
$a[0] = 0
$a[1] = 1
・・・
$a[9] = 9
となります。配列については、この後のレッスンで詳しく説明します。

 

★課題
1. 以下のフローを満たすプログラムを作成してください。

(1) $aに整数32を代入
$bに整数56を代入
掛け算の結果が150以上ならば「True」を表示、そうでなければ「False」を表示
掛け算の結果が200未満ならば「True」を表示、そうでなければ「False」を表示
足し算の結果が80以上、かつ掛け算の結果が150未満ならば「True」を表示、
そうでなければ「False」を表示
足し算の結果が90以下、または掛け算の結果が180以下なら「True」を表示、
そうでなければ「False」を表示

(2) @aに配列("This ", "is ", "", "a ", "test.")を代入
for文を用いて、配列の中身を全て表示
2番目(添え字は1)の中身が空の場合は「True」を表示、そうでなければ「False」を表示
3番目(添え字は2)の中身が空で、かつ4番目(添え字は3)の中身がtextより小さい場合は
「True」を表示、そうでなければ「False」を表示

(3) @aに配列(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20)を代入
for文を用いて、偶数のみを表示
for文を用いて、5から14までを表示
while文を用いて、1から9までを表示
foreach文を用いて、3で割り切れる数字のみを表示

(4) @aに配列(32,646,308,431,639,78,143,169,490,144,612,113,327,51)を代入
for文を用いて、偶数のみを表示
foreach文を用いて、3で割り切れない数字を表示
while文を用いて、2で割った答えを表示
for文を用いて、5で割った余りを表示

 

★前回の課題の解答
1. 下の文をuntil文を使って、書き直してください。

for ($i = 0; $i < 9; $i++) {
print $i;
}

→解答
$i = 0;
until ($i >= 9) {
print $i++;
}

■解説
until文は、条件文が真になるまで実行ですので、条件文が偽の場合は、ループが
実行されます。
$i == 9
でも構いませんが、何かの拍子に$iが10以上になってしまうと無限ループに入って
しまうので、
$i >= 9
でループを抜け出した方が安全でしょう。

2. 下の47都道府県を配列に格納し、foreach文を使って、HTML中に出力して
ください。

"北海道", "青森県", "岩手県", "宮城県", "秋田県", "山形県", "福島県",
"茨城県", "栃木県", "群馬県", "埼玉県", "千葉県", "東京都", "神奈川県",
"新潟県", "富山県", "石川県", "福井県", "山梨県", "長野県", "岐阜県",
"静岡県", "愛知県", "三重県", "滋賀県", "京都府", "大阪府", "兵庫県",
"奈良県", "和歌山県", "鳥取県", "島根県", "岡山県", "広島県", "山口県",
"徳島県", "香川県", "愛媛県", "高知県", "福岡県", "佐賀県", "長崎県",
"熊本県", "大分県", "宮崎県", "鹿児島県", "沖縄県"

→下のサンプルを参照してください。

-----------------------------------------------------------------
#! /usr/local/bin/perl

print "Content-type:text/html\n\n";
print << "END_OF_HTML";
<HTML>
<BODY>
END_OF_HTML

@pref = (
"北海道", "青森県", "岩手県", "宮城県", "秋田県", "山形県", "福島県",
"茨城県", "栃木県", "群馬県", "埼玉県", "千葉県", "東京都", "神奈川県",
"新潟県", "富山県", "石川県", "福井県", "山梨県", "長野県", "岐阜県",
"静岡県", "愛知県", "三重県", "滋賀県", "京都府", "大阪府", "兵庫県",
"奈良県", "和歌山県", "鳥取県", "島根県", "岡山県", "広島県", "山口県",
"徳島県", "香川県", "愛媛県", "高知県", "福岡県", "佐賀県", "長崎県",
"熊本県", "大分県", "宮崎県", "鹿児島県", "沖縄県");

foreach (@pref) {
print $_ . '<br>';
}

print << "END_OF_HTML";
</BODY>
</HTML>

END_OF_HTML

exit;
-----------------------------------------------------------------

■解説
カンマ区切りで記述してあるので、データをコピーしてそのまま使用できたかと
思います。

foreach文を使えば、$_で中身を取り出せます。




前の章へ 次の章へ


このエントリーをはてなブックマークに追加


OfficeLance

お問い合わせはこちらから