2. Perlの文法、条件式
今日は、Perlの文法、条件式について簡単に説明していきます。
■条件式
if文やfor文などの条件に使用する式は以下のようなものがあります。
== 等しい
!= 等しくない
< より小さい
> より大きい
<= 以下
>= 以上
eq 文字列比較 - 等しい ( equal イコール )
ne 文字列比較 - 等しくない ( not equal ノットイコール )
lt 文字列比較 - より小さい ( less than レスザン )
gt 文字列比較 - より大きい ( greater than グレーターザン )
le 文字列比較 - 以下 ( less than or equal レスザンまたはイコール )
ge 文字列比較 - 以上 ( greater than or equal グレーターザンまたはイコール )
and かつ (論理積)
or または (論理和)
not 否定
&& and と同じ
|| or と同じ
! not と同じ
条件文で変数の中を比較したり、大小を判定する時に使用します。
■if () 文 判定
if文は、プログラムでもっともよく使用する条件判定です。
if (条件1) {
条件1が真のとき
}
elsif (条件2) {
条件2が真のとき
}
else {
条件1も条件2も偽のとき
}
条件文の結果が 1, 2 などの数値の場合は、真 と同じ扱いになります。
0 の場合は 偽 となります。
-----------------------------------------------------------------
$a = 1;
if ($a == 1) { $b = 2; }
if ($a == 1) {
$b = 2;
}
#上記は両方とも、$a の値が 1 だったら$b に 2 を代入する
if ($a) {
# $a が 2 でも真になるので注意
$b = 2;
}
else {
# $a が 0 の場合はこちらが実行される
$b = 4;
}
if ($a == 1 && $b == 2) {
# $a が 1 で、なおかつ $b が 2 の時にこちらが実行される
$c = 1;
}
$a = 'test';
if ($a eq 'test') {
# $a が文字列「test」ならばこちらが実行される
$c = 1;
}
if ($a ne 'error') {
# $a が「error」でなければこちらが実行される
$c = 1;
}
-----------------------------------------------------------------
■for () ループ
for文は、ある条件まで初期値から、一定の増分でループさせたい場合に使用します。
for (初期値; 条件; 増分) {
last; # ループ脱出
next; # 次のループへ
}
条件が偽になるまで、{} 内を繰り返し実行します。
始めに初期値の部分が実行され、{} 内の最後まで実行された後、増分の部分が実行
されます。
-----------------------------------------------------------------
for ($i = 1; $i <= 10; $i++) {
# $i を 1 から 10 までループさせ、カッコ内を実行する
$a[$i] = 2;
}
for ($i = 1, $j = 1; $i <= 10 and $j >= 0; $i++, $j++) {
# 複数の式を書くことも可能
$a[$i] = ++$j;
}
for (;;) {
# 無限ループとなるので、中でループ脱出する条件文を書かなければならならい
}
-----------------------------------------------------------------
無限ループになってしまうと、サーバがダウンしてしまうことがあるので、注意が
必要です。
■foreach () ループ
foreach文は、配列の中身を 0 から最後まで順番に取り出す時に使用します。
foreach (配列変数) {
$_ # 配列要素
last; # ループ脱出
next; # 次のループへ
}
-----------------------------------------------------------------
foreach (@a) {
$_ = 1;
}
-----------------------------------------------------------------
上の文は、@aという配列を 0 から 配列の終わりまでをループし、配列の値に
それぞれ 1 を代入しています。
上の文は、以下の処理と同じになります。
-----------------------------------------------------------------
for ($i = 0; $i <= $#a; $i++) {
$a[$i] = 1;
}
-----------------------------------------------------------------
$#a は 配列の最終添字となるので、$a[0] から $a[9] と配列がある場合、
$#a は 9 となります。
配列については、別の機会に詳しく説明します。
■while () ループ
while文は、ある条件が満たす間、{}内を繰り返し実行します。
while (条件) {
条件が真のときループ
last; #// ループ脱出
next; #// 次のループへ
}
■until () ループ
until文は、ある条件が満たされるまで、{}内を繰り返し実行します。
until (条件) {
条件が偽りのときループ
last; #// ループ脱出
next; #// 次のループへ
}
■do () ループ
do 〜 until文は、ある条件が満たされるまで、{}内を繰り返し実行します。
do 〜 until文の場合は、ループの中身が一度は必ず実行されます。
do {
条件が偽りのときループ
last; #// ループ脱出
next; #// 次のループへ
} until (条件);
■exit 脱出
Perlを途中で終了する場合や、関数を抜ける場合は、以下の文を使用します。
exit; #// Perl 終了
return; #// 関数終了
関数については、別の機会に詳しく説明します。
★今日のまとめサンプルプログラム
-----------------------------------------------------------------
#! /usr/local/bin/perl
print "Content-type:text/html\n\n";
print << "END_OF_HTML";
<HTML>
<BODY>
END_OF_HTML
print '[for文]<br>';
@week = ('sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat') ;
for ($i = 0; $i <= $#week; $i++) {
print $week[$i] . '<br>';
}
print '<br>[foreachで記述]<br>';
foreach (@week) {
print $_ . '<br>';
}
print '<br>[whileで記述]<br>';
$i = 0;
while ($i <= $#week) {
print $week[$i++] . '<br>';
}
# よくない例
print '<br>[whileの別バージョン]<br>';
$i = 0;
while (1) {
# 無限ループ
print $week[$i++] . '<br>';
if ($i > $#week) {
# 無限ループを脱出
last;
}
}
print << "END_OF_HTML";
</BODY>
</HTML>
END_OF_HTML
exit;
-----------------------------------------------------------------
■解説
いくつかのループの記述方法を書いてみました。すべて同じ配列の中身を表示する
プログラムです。
出力結果は、全部同じになっていますが、記述形式を比較してみてください。
★課題
1. 下の文をuntil文を使って、書き直してください。
for ($i = 0; $i < 9; $i++) {
print $i;
}
2. 下の47都道府県を配列に格納し、foreach文を使って、HTML中に出力して
ください。
"北海道", "青森県", "岩手県", "宮城県", "秋田県", "山形県", "福島県",
"茨城県", "栃木県", "群馬県", "埼玉県", "千葉県", "東京都", "神奈川県",
"新潟県", "富山県", "石川県", "福井県", "山梨県", "長野県", "岐阜県",
"静岡県", "愛知県", "三重県", "滋賀県", "京都府", "大阪府", "兵庫県",
"奈良県", "和歌山県", "鳥取県", "島根県", "岡山県", "広島県", "山口県",
"徳島県", "香川県", "愛媛県", "高知県", "福岡県", "佐賀県", "長崎県",
"熊本県", "大分県", "宮崎県", "鹿児島県", "沖縄県"
★前回の課題の解答
1. 以下の2つの変数の加算、減算、掛け算、割り算、余りの結果をHTML中に出力
してください。
42
19
→下のサンプルを参照してください。
2. 以下の4つの文字列を配列に格納し、HTML中に文字列をつなげて出力してください。
'This'
' is '
'a test '
'program.'
→下のサンプルを参照してください。
-----------------------------------------------------------------
#! /usr/local/bin/perl
print "Content-type:text/html\n\n";
print << "END_OF_HTML";
<HTML>
<BODY>
END_OF_HTML
# 1.の解答例
$a = 42;
$b = 19;
print "$a + $b = ";
print $a + $b;
print '<br>';
print "$a - $b = ";
print $a - $b;
print '<br>';
print "$a * $b = ";
print $a * $b;
print '<br>';
print "$a / $b = ";
print $a / $b;
print '<br>';
print "$a % $b = ";
print $a % $b;
print '<br><br>';
# 2.の解答例
@str = ('This', ' is ', 'a test ', 'program.');
print $str[0] . $str[1] . $str[2] . $str[3];
print << "END_OF_HTML";
</BODY>
</HTML>
END_OF_HTML
exit;
-----------------------------------------------------------------
■解説
$c = $a + $b;
のように結果を格納する変数を作ってももちろんOKです。
配列の部分は今日ご紹介したfor文でループして表示させると楽ですね。
|