if / unless (条件分岐)
if文とは、ある条件によって行なう処理を分岐させたいときに使用します。 ある条件を指定してその条件に合うのか否かを判定し、その判定に応じた処理をしたい時に使います。 C言語では if文の後に続くステートメントが一行の時は、処理ブロックを示す "{}"を省略して記述出来ますが Perlでは省略できません。
ある条件が真の時だけ特定の処理を実行したい場合に使用
[ 表記法 ]
if ( 条件 ) {
処理ブロック
}
[ フローチャート ]
真の時/偽の時の処理も記述出来ます。 ( else )
[ 表記法 ]
if ( 条件 ) {
条件が真の処理
} else {
条件が偽の処理
}
[ フローチャート ]
真の条件を1つだけでなく複数にする事も可能です( elsif )
[ 表記法 ]
if ( 条件1 ) {
条件1が真の処理
} elsif ( 条件2 ) {
条件2が真の処理
}
[ フローチャート ]

※ elsif は elseif と間違えて記述しがちなので注意して下さい
if とは正反対の意味です( unless )
[ 表記法 ]
unless ( 条件 ) {
条件が偽の時に実行
}
[ フローチャート ]

※ unless の次に elsif を評価する事もできますが elsif は通常と同じく真の時に処理ブロックが実行されます。メンテナンスと複雑さを避ける為 unless と elsif の併用は避ける方が無難かもしれません。
繰り返し ( while )
whileは、条件が 真の間{}で囲まれた処理ブロックを繰り返し実行します。この時条件の判定は処理ブロックが実行される前に行われます。
[ 表記法 ]
while ( 条件 ) {
処理ブロック
}
[ フローチャート ]

Perlの特徴の一つが省略した記述をできる事です。 CGIプログラムなどでは入力用として次の構文を良く省略しています。解析する際にどこに値が入るのかとビックリしないよう良く覚えておいて下さい。
このサンプルは2つとも標準入力を Ctr+"Z" が押されるまで1行ずつ $_ へ代入していきます。
[ 非省略形 ]
while ( $_ = <STDIN> ) {
処理ブロック
}
[ 省略形 ]
while ( <> ) {
処理ブロック
}
繰り返し ( until )
untilは whileとは逆に条件が 偽の間(真になるまで){}で囲まれた処理ブロックを繰り返し実行します。この時条件の判定は処理ブロックが実行される前に行われます。
[ 表記法 ]
until ( 条件 ) {
処理ブロック
}
繰り返し ( for / foreach )
繰り返し ( for )
for ステートメント は回数指定で処理する場合や、配列の要素全てに処理する場合に良く使用されます。 Perl で for 文の終了条件は [ 偽 ] になるまでです。 Visual Basic では [ 真 ] になるまでと違いがありますので、Visual Basicに慣れている方は注意して下さい。
[ 書式 ]
for ( 初期値 ; 終了条件 ; 増分値 ) {
処理ブロック
}
カウンタがある数値になるまで処理を繰返す
for ( $a = 1 ; $a <= 10 ; $a++ ) {
print "$a \n" ;
}
まず $a の値を初期値で指定した1に設定します。 次は printステートメントで $a の値を出力し、今度は $a の値が 10 以下であるか判断し、以下であれば $a の値をインクリメントします。 これを終了条件である10以下の間処理を繰返します。
回数を指定して処理を繰返す
for ( 1..10 ) {
print "$_ \n" ;
}
これは上のサンプルと同じ動きをします。 このように記述した場合 カウンタは特殊変数 $_ が使用されます。 $_ の値が 1から 10まで順に代入されて、終わった段階でこの forステートメントを終了します。
繰り返し ( foreach )
foreachステートメントは 配列全てを繰り返す場合に非常に便利です。 配列要素の先頭の値から順次スカラ変数へ代入されて、全ての要素を参照し終わった時点で繰り返しを終了します。
foreach スカラ変数 ( リスト値 ) {
処理ブロック
}
配列の全ての要素に対して処理を行う
@arr = ( 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ) ;
foreach $a (@arr ) {
print "$a \n" ;
}
上のサンプルと同等の処理です
foreach $a ( 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ) {
print "$a \n" ;
}
繰り返し ( do〜while , do〜until )
他の言語と異なり、Perlの doステートメントは単に繰返しとしてだけではなく、1つのブロックとしての意味を持ちます。 又 doステートメントによって判定を行う時点を変更する事も可能です。
[ フローチャート ]
do〜while
do {
処理ブロック
} while ( 終了条件 );
while と終了条件は同じですが条件式がブロックの最後にあるので、この繰り返しは必ず1回は処理ブロックを実行する事になるます。
do〜until
do {
処理ブロック
} until ( 終了条件 );
until と終了条件は同じですが上のサンプル同様に条件式がブロックの最後にあるので、この繰り返しも必ず1回は処理ブロックを実行する事になるます。
ループ制御
last
C言語の break , Visual Baxic の exit ( for, do ) と同じで、一番内側、又はラベルで指定したブロックを抜けます。
while (1) {
if ( $a == 1 ) { last ; }
}
終了条件に真となる1を指定している事に、この繰り返しは何もしなければ 永久ループになってしまい、永久に繰り返しを行います。 しかし $a の値が1となった段階で lastによってこの whileループを抜ける事が出来ます。
next
残りのコードをスキップして判断文に制御をします。
redo
残りのコードをスキップしてブロックの先頭に制御を戻どします。
※この時制御判断を行いません。
その他の書き方
式修飾子
対象のステートメントが1文からなる時に処理条件をステートメントの後に記述する事が可能です。( if , unless , until , while )
| 通常通り |
特殊な書き方 |
| if ( $a == 1 ) { print " Hello World !! " ; } |
print " Hello World !! " if $a == 1 ; |
| while ( $a ) { print $a-- . "\n" ; } |
print $a-- . "\n" while $a ; |
|
多岐分岐文のエミュレート
今まで制御構文を取り上げてきましたが、Perlには C言語、Java の switch や、Visual Basic の select ステートメントで実現されている多岐分岐文に相当する構文がありません。 しかし、その他の構文を上手く組み合せる事で同等の機能を実現する事が出来ます。
下記の例では全体を1つのブロックとして条件が真となった時点で lastステートメントを使ってブロックを抜けています。 全てが偽の時にだけ一番下のステートメントが実行される事になります。
{
if ( $a == 10 ) { print " this is 10 " ; last ; }
if ( $a == 20 ) { print " this is 20 " ; last ; }
if ( $a == 30 ) { print " this is 30 " ; last ; }
print "No Match ";
}
これも上の例と同じ結果となります。ラベル付のブロック(SELECT) を作成し条件と処理ブロック( do )を && 演算子で結合します ( Perl で && 演算子は左辺が偽であれば右辺を評価しない為 ) 処理ブロックが実行された時点で lastステートメントを使って SELECTブロックを終了します。
SELECT:
{
$a == 10 && do {
print " this is 10 ";
last SELECT ;
};
$a == 20 && do {
print " this is 20 ";
last SELECT ;
};
$a == 30 && do {
print " this is 30 ";
last SELECT ;
};
print "No Match ";
}
|