|
繰り返し文
ループ文とも言います。
とりあえず以下の4つがあります。
- while(条件文){実行文} 条件文が正しい間は実行文を繰り返し続ける。
- until(条件文){実行文} 条件文が間違いの間は実行文を繰り返し続ける。
- for(初期化;条件文;増減式){実行文} 条件式が正しければ実行文を繰り返し、次に増減式
を実行する。通常、増減式の実行を繰り返すことによって条件文が偽に近づく。
- foreach 制御変数(リスト値){ 実行 } リスト値の要素を順に制御変数にセットして、実
行文を繰り返す。リスト値がなくなるとループは終了する。
|
例、
【while】
#!c:/perl/bin/perl
print "Content-type: text/html; charset=Shift_JIS\n\n";
$i = 3;
while ($i > 0) {
print "$i <br>";
$i--;
}
【until】
#!c:/perl/bin/perl
print "Content-type: text/html; charset=Shift_JIS\n\n";
$i = 3;
until ($i <= 0) {
print "$i <br>";
$i--;
}
【for】
#!c:/perl/bin/perl
print "Content-type: text/html; charset=Shift_JIS\n\n";
for ($i=3; $i>0; $i--) {
print "$i <br>";
}
【foreach】
#!c:/perl/bin/perl
print "Content-type: text/html; charset=Shift_JIS\n\n";
foreach $i (3, 2, 1) {
print "$i <br>";
}
↓
3
2
1
【ハッシュの例】
for my $key(keys(%$hoge)){
print $key.",".$hoge->{$key}."\n";
}
|
すみません。面白い例が思いつきませんでした。m(_ _)m
いずれの場合も同じ結果となります。
あらかじめ繰り返す回数が分かっているときは for、
回数は分からないけれど配列などでデーターがあるだけ全部を処理するときは foreach。
while や until は回数ではなく、条件でループを終了させたいときに、使用することが多
いと思います。
ここで処理を誤るとループから抜け出せなくなり、待てど暮らせど処理が終わらないと
いうことになったり、パソコンが固まったりします。
そんなに起こるミスではないのですが、起こすととても凹むので気をつけましょう。
また、プロバイダーにアップしてこれをやってしまうとCGIの使用を禁止されると思います。
あと余談ですが、
foreach は省略して for と書いてもかまいません。上の例だと for $i (3,2,1) みたいな。
Perlがてきとーに「あ、このforはforeachの略なんだな」って判断してくれるようです。
ループの制御
last | ループを終了します。 |
next | ループをスキップします。 |
redo | ループをやり直します。 |
例、
#!c:/perl/bin/perl
print "Content-type: text/html; charset=Shift_JIS\n\n";
@x=(5,4,3,2,1);
foreach $i (@x) {
if ($i == 4) { next; }
if ($i == 2) { last; }
print "$i <br>";
}
↓
5
3
|
例、
#!c:/perl/bin/perl
print "Content-type: text/html; charset=Shift_JIS\n\n";
# 無限ループ
@x=(5,4,3,2,1);
foreach $i (@x) {
if ($i == 4) { redo; }
if ($i == 2) { last; }
print "$i <br>";
}
↓
※4のところで最初に戻るので、終わりません。
|
ラベル |
ループ文でネストしているときに、
last、next、redo、の行き先を指定できます。
書き方
・ループの書き出しの部分に書きます。
・文字列の後ろにコロンをつけます。
・ラベルは大文字で書くことが多いです。
|
例、
#!c:/perl/bin/perl
print "Content-type: text/html; charset=Shift_JIS\n\n";
@x=(5,4,3,2,1);
HOGE:
for my $x (@x) {
@y=("e","d","c","b","a");
MOGE:
for my $y (@y) {
if(($x=3)and($y="c")){last HOGE;}
print $x." ".$y;
}
print "<br>";
}
↓
5e5d5c5b5a
4e4d4c4b4a
3e3d
|
なんか、lastでしか使うこと無いような気がします。
$_
やっほー私のことだよ。
Perlの記号ってググっても検索できないものが多いんだよね。
たとえば私の場合、$_ でも "$_" でも ダラーアンダーバー でも出てこないの。ちな
みに 特殊変数 で検索したらいっぱいヒットするんだけどそんなの分からないよね。
で、その特殊変数なんだけど、たくさん種類があるから覚えるのが大変なので、ここで
はとりあえず、私、$_ のことだけ説明するね。
デフォルトの変数
プログラムのいろんな場所で、捜査対象の変数を指定しないと $_ を指定したとみなさ
れます。
だから、一時的に使うその場限りの変数だったら何も指定しないで $_ で済ましてしま
うことが出来ます。
たとえば、↑の例で、foreachの制御変数(i)を指定しないとループの中身ではデフォル
ト特殊変数の $_ を使用したとみなして動きます。エラーにはなりません。
以下に上の例と同じものを書き足すとこうなります。
例、
#!c:/perl/bin/perl
print "Content-type: text/html; charset=Shift_JIS\n\n";
@x=(5,4,3,2,1);
foreach (@x) {
if ($_ == 4) { next; }
if ($_ == 2) { last; }
print;
print "<br>";
}
↓
5
3
|
↓
省略できる部分
#!c:/perl/bin/perl
print "Content-type: text/html; charset=Shift_JIS\n\n";
@x=(5,4,3,2,1);
foreach $_ (@x) {
if ($_ == 4) { next; }
if ($_ == 2) { last; }
print $_;
print "<br>";
}
↓
5
3
一応私が働く場所を詳しく書くと以下のようになるけど、別に丸暗記しなくてもいいです。
- abs, alarm, chomp, chop, chr, chroot, cos, defined, eval, exp, fork, glob,
hex, int, lc, lcfirst, length, log, lstat, oct, ord, pos, print, printf, quotemeta,
readlink, ref, require, rmdir, split, sqrt, stat, study, uc, ucfirst, unlink
- ファイルテスト演算子で対象を指定しなかった場合。
- パタンマッチ m//、置換 s///、変換y///、tr///を、=~演算子なしで使った場合。
- foreach、forループでループ変数を省略した場合。
- whileループで、条件部が<>やreadlineやglobが単独でおかれている場合。
- grep関数、map関数。
その他の繰り返し
他にも繰り返しっぽいものを集めて見ました。
.. または ... | 範囲指定 |
x (英語小文字のエックス) | 文字の繰り返し |
grep | リストや配列から検索して出力 |
map | リストや配列に操作を行ったものを出力 |
パターンマッチの g | 繰り返し検索とか置き換えとか |
.. と x の例 |
#!c:/perl/bin/perl
print "Content-type: text/html; charset=Shift_JIS\n\n";
print 1..9;
print "<br>";
print 1x9;
↓
123456789
111111111
|
.. は条件文での判定で使うこともできます。
.. と ... は大して違いませんので .. を使いましょう。
(^_^; 私も使いどころが分からない(汗)
grepの例 |
#!c:/perl/bin/perl
print "Content-type: text/html; charset=Shift_JIS\n\n";
@x = ('ネオロマ ','ジュネ ','×(かける) ','池袋乙女ロード ');
@y = grep(/ロ/,@x);
print @y;
↓
ネオロマ 池袋乙女ロード
|
grepの基本形。
grep(/パターン/,リスト);
|
パターンは検索する文字そのものだったり、パターンだったりします。パターンとは条件
式みたいなものです。例えば a-z と書くと「小文字のaからzまでのどれか」という意味に
なります。こういう式を正規表現といいます。正規表現についてはまた後で説明します。
上の例では @x の中でカタカナの ロ が含まれているものを最初から最後まで調べて抽出
しました。
mapの例 |
#!c:/perl/bin/perl
print "Content-type: text/html; charset=Shift_JIS\n\n";
@x=(1,2,3,4,5);
@y=map{$_ ** 2}@x;
print "$x[0], $x[1], $x[2], $x[3], $x[4]";
print ' 2乗しました ';
print "$y[0], $y[1], $y[2], $y[3], $y[4]";
↓
1, 2, 3, 4, 5
↓2乗しました
1, 4, 9, 16, 25
|
mapの基本形。
map {どうにかする命令} リスト;
|
上の例で、@y=map{$_ ** 2}@x; は以下のよう書くことも出来ます。
for (@x) {
push(@y,$_ ** 2);
}
(pushは配列のおしりにデータを追加せよという命令です)
このようにプログラムでは1つのことをするのに色んな書き方が出来るます。
特に grep や map に関しては、繰り返し文でまったく同じことが出来るのですが、リ
ストや配列のような文字の集まりで限定された目的ではこちらを使うほうがスマートなの
で使うことが多いです。別にどっちでも良いです。
パターンマッチの g 例 |
#!c:/perl/bin/perl
print "Content-type: text/html; charset=Shift_JIS\n\n";
$x="Perlたん、PHPたん、Rubyたん";
$x=~s/たん//g;
print $x;
↓
Perl、PHP、Ruby
($=~/たん// の基本形は データ=~/検索文字/置換文字/オプション)
|
「たん」を何も無い「」に置き換えました。
繰り返しオプションの g が無いと最初の1つしか置き換えません。
置き換えについては後の正規表現のコーナーで説明します。
この置き換えも繰り返し文と条件文でまったく同じことが出来ますが、まあせっかく便
利なものが用意されているのだから使いましょう。
他の言語では最初から1文字ずつ読んで1文字ずつ処理を繰り返すといったプログラム
を書いたりもします。Perlはこういった文字操作に関する命令が充実してるので、たくさ
ん覚えればプログラムを組むのが楽ちんになります。
|
というわけで劇的にお薦めのコミックを紹介します。
私が愛してやまない漫画なんですが、気がつけばこれを知らなければネット上のパロディ
ーについてゆけない状態になっていました。
ファンとしては間違った広まり方に対して少し複雑な気分でもあるのですが、まあ、良し
としましょう。
今のところアマゾンでまとめ買いできるのは以下のセットだけです。残りは単体購入にな
ります。というか古本屋でもだいぶん買えます。
第1部「ファントムブラッド」と第2部「戦闘潮流」
第3部「スターダストクルセイダース」
シリーズは以下のように続いています。
第1部「ファントムブラッド」
第2部「戦闘潮流」
第3部「スターダストクルセイダース」
第4部「ダイヤモンドは砕けない」
第5部「黄金の風」
第6部「ストーンオーシャン」
第7部「スティール・ボール・ラン」
第7部は現在連載中です。
参考サイト
■1-6部の動画
■7部の動画
このマンガについて語りだすとそれだけでもう1つサイトが出来てしまうぐらいなのでこれぐらいでやめにしておきます。
ちなみにDVDで、下のリンクからたどると分かりますが定価の高さに対して中古の安さが素晴らしい。(^_^;
|
|