EBSに役立つPerl講座
戻る
制御構文
条件分岐や繰り返し処理など、スクリプトの動作に関する主な制御構文を紹介します。
if文
unless文
for文
foreach文
while文
until文
last文
next文
do文
条件分岐if
if ( 条件式1 ) { 条件式がtrueのとき実行; }
elsif ( 条件式2 ) { 条件式1がfalseかつ、条件式2がtrueの時実行; }
else { 上記のどれにも当てはまらなかったとき実行; }
elsif文やelse文は必要無ければ、無くても構いません。またelsif文はいくつでも追加することが出来ます。分岐が複雑になると構造が見えにくくなるので、if文を使用するときはインデントして記述する癖をつけておきましょう。
条件式は0もしくは空白ならば false 、それ以外なら true と判断されます。詳しくは
演算子
の項を参照してください。
例1:
$kazu = rand(100);
if ($kazu < 10) {print"大吉!";}
elsif ($kazu < 30) {print"中吉。";}
elsif ($kazu<80) {print"吉。";}
else {print"凶……";}
結果:
これを実行した場合、10%で大吉、20%で中吉、50%で吉、20%で凶の文字が出力されることになります。
rand()関数に関しては
こちら
を参照してください。
例2:
if (!$name) {print"名前が記入されていません!";}
結果:
変数が空白の場合も false を返すので、このように使用することも出来ます。
条件分岐unless
unless ( 条件文1 ) { 条件文1が false のとき実行; }
elsif ( 条件文2 ) { 条件文1が ture かつ、条件文2が true のとき実行; }
else { 上記のどれにも当てはまらなかったとき実行; }
ちょうどifと逆の論理となる、条件分岐構造です。unlessは否定型の動作をします。
ただし、以下に続くelseif文は通常の肯定型の動作になるので注意。残念ながらunlessifというのは存在しません。
あまり多用するとわかりにくくなるので、if文の条件式に論理否定演算子 ! や not をつけたほうが無難でしょう。
繰り返し処理for
for ( 初期値; 条件式; 増減式 ) { 繰り返す処理; }
for文は、条件で与えられた一定の回数だけ繰り返す構文です。
まず初期値が代入され、条件式を満たしている間順に繰り返されていきます。1回繰り返すごとに、増減部分が評価され、条件式を満たさなくなった場合に繰り返し処理から抜けます。
例:
for ($i=1; $i<=5; $i++) { print "$i番、"; }
出力:
1番、2番、3番、4番、5番
なお、上記の文は以下のように省略することも出来ます。
for ( 1..5 ) { print "$_番"; }
繰り返し処理foreach
foreach ( 配列変数 ) { 繰り返す処理; }
foreach文は配列のそれぞれ全ての値に対して、処理を行う繰り返し構文です。
配列の[0]から、存在する配列の最後尾まで順に繰り返してゆきます。
例:
@all = ( 1,3,5,7 );
foreach ( @all ) { $_++; }
結果:
この場合、全ての配列の値に+1ずつしているので、配列変数@all==( 2,4,6,8 )なっているはずです。
繰り返し処理while
while ( 条件式 ) { 条件文を満たしている間繰り返す; }
while文は、条件式を満たしている間、処理を繰り返し行う構文です。
まず始めに条件文が評価され、trueであったら処理を実行し、falseであったらwhile文を抜けて次の文に移行します。次に条件式が評価されるのは、再びwhile文の一番上まで処理が戻ってきたときです。条件文を満たさなくなった瞬間にwhile文を抜けるわけではありません。
while文を使用すると比較的無限ループに陥りやすいので、しっかりと条件設定をしておきましょう。
例:
while ($i==10) { print "$i、"; $i++; }
出力:
0、1、2、3、4、5、6、7、8、9、10
繰り返し処理until文
until ( 条件文 ) { 条件文を満たすまで繰り返す; }
until文はwhile文のちょうど逆にあたり、whileが肯定論理なのに対し、untilは否定論理型となります。条件式が評価されたとき、trueであったらuntil文を抜けます。
while文の条件式に否定演算子 ! や not をつけた場合と全く同じ動作です。
last文
last;
last文が評価されたとき、最も内側の繰り返しループを抜けます。
また、ラベルを設定することで任意のループ処理から抜けることも出来ます。
例:
while ( $kazu < 100 ) {
if ( $kazu == 50 ) { last; }
$kazu++
}
結果:
変数$kazuが100以上になるか、ちょうど50になったときにこのループを抜けます。
next文
next;
next文が評価されたとき、最も内側のループの以下の処理をスキップし、再びループの先頭に戻って次のループ処理を実行します。ラベルを使用することも出来ます。
例:
for (1..10) {
if ( $_ % 2 ==0 ) { next; }
print"$_、";
}
出力:
1、3、5、7、9
do文
do { 処理 } if,while等 ( 条件文 );
do文を用いることで、if,while,unless,untilの構成順序を逆転することが出来ます。
これ自体にはそれほど意味は無いのですが、処理される文が1文のときに限り、do{}を省略して記述することが出来ます。
より簡単にif文等を記述したいときには便利でしょう。
例:
print "hello!" if ($_==0) ;
結果:
if ( $_==0 ) { print "hello!"; } と全く同じ意味。
戻る