foreach修飾子・while文・while修飾子

なんかヘンな区切りで時間をあけてしまったためになんか入り込みづらい…。
まずはforeach修飾子から。

@touhoku = ('青森県','秋田県','岩手県','山形県','福島県');

print "東北にある県は…?n";

print "$_?n" foreach @touhoku;	# @touhokuから1つずつ抽出

print "…です。?n";

修飾子シリーズはソースをシンプルにしてくれるところが大変いいかんじ。
同じアウトプットを得るために色々な書き方があるというPerlの魅力がだんだん分かってきた気が…するようなしないような(^^ゞ

これを実行するとこんなかんじ。

E:?Perl>perl foreach3.pl
東北にある県は…
青森県
秋田県
岩手県
山形県
福島県
…です。

つづいてwhile文。

#ループ−while
while (<>)
{
	print;
}

while文は繰り返し回数以外の条件でも使われる…ってことですがどういう意味でしょう?
これに以前作成したshikoku.datやkyusyu.datをつけて実行するとこんなかんじ。

E:?Perl>perl while1.pl shikoku.dat
香川県
愛媛県
高知県
徳島県

E:?Perl>perl while1.pl kyusyu.dat
福岡県
佐賀県
長崎県
大分県
宮崎県
熊本県
鹿児島県

なにもオプションをつけずに実行するとずっと待ち状態になります…(^^ゞ
あーなるほど、「条件が真である」限りループ処理を繰り返すってことですね。

んーと。
while ($_ = <>)で特殊変数$_に対して無名ファイルハンドル<>が初期設定となっていますので、コマンドライン指定ファイルの1行目から読み込む、と。ふむふむ。
で、while文なので行がある限り処理を続ける。
printにオプションがないんですが、これは"print $_"を省略して書いているということらしい。うーん、厳密さを求められるプログラムで記述を省略できるってのは何も知らない初心者の私から言わせてもらうとかなり斬新(^^♪

で、当然な展開ですがwhile文に対してwhile修飾子もあるわけですよ。

#ループ−while修飾子
$count = 100;
print "カウントダウン!!?n";
print $count--, "?n" while ($count >= 0);

これを実行すると…って載せるのはやめておきますが、100から1までカウントダウンします。

print $count--, "?n" while ($count >= 0);の行がwhile修飾子。
まず"--"は"$スカラー変数-1"と同意でスカラー変数の中身を-1する算術演算子。ふむ。
つまり最初$countに100が入って、実行されるたびに-1されていく。で、$countが0と等しくなるまで連続して実行される。フーム、なるほどぉ。

最後にuntil文。
whileの逆で「条件が偽である」限りループ処理を続ける。

# ループ−until
$sec = $ARGV[0];	# まずは$secに変数を代入
print "$ARGV[0] 秒タイマーです。?n";

until ($sec == 0)	# $secが0でない間はループ処理を続ける
{
	print $sec--, "?n";
	sleep(1);	# 1秒ずつインターバル ※sleepって「およそ」らしいですが
}

print "?a";
print "$ARGV[0] 秒経過しました!!?n";

これを実行するとこんなかんじ。

E:?Perl>perl until1.pl 10
10 秒タイマーです。
10
9
8
7
6
5
4
3
2
1
10 秒経過しました!!

until文以外はこれまでに出て来たものの組み合わせなので問題ないですねー(^^♪
最後にお約束のuntil修飾子。

# ループ−until修飾子
print "2の階乗(1-16)は…?n";
print 2 ** (++$jou), "?n" until ($jou == 16);

2の1乗から16乗までを計算します。
実行するとこんなかんじ。

E:?Perl>perl until2.pl
2の階乗(1-16)は…
2
4
8
16
32
64
128
256
512
1024
2048
4096
8192
16384
32768
65536

今回のおまけポイントは"++$jou"。以前出て来た"$jou++"形式と違って++の位置が変わり、インクリメントのタイミングが変わる。
今回は++$jouなのでインクリメントしてからスカラー変数が使われます。
なるほどねー。
あー、もう寝る。