for では $. はカウントされない
golferPerl の偉い人には常識なんだろうけれど。現在の入力ファイル行番号 $. は、for ではカウントされない。while だとカウントされる。
[takeyuki@sunya ^]$ cal | perl -e 'print$..$_ for<>' 8 2月 2010 8日 月 火 水 木 金 土 8 1 2 3 4 5 6 8 7 8 9 10 11 12 13 814 15 16 17 18 19 20 821 22 23 24 25 26 27 828 8 [takeyuki@sunya ~]$ cal | perl -e 'print$..$_ while<>' 1 2月 2010 2日 月 火 水 木 金 土 3 1 2 3 4 5 6 4 7 8 9 10 11 12 13 514 15 16 17 18 19 20 621 22 23 24 25 26 27 728 8
for の場合、入力ストリーム全体の行数になっているように見えるけれど、これはどういうことだろう。
追記
コメントをいただいた。for(expr) の expr はリストコンテキストで評価され、while(expr) の expr はスカラコンテキストで評価される、と。<> をリストコンテキストで評価するとストリームを全部読んできて $/ で切った文字列のリストを作る、ということを知ったのも大きな収穫。for の例は次のコードと同じことだな。
[takeyuki@sunya ~]$ cal | perl -e '@x=<>;print $..$_ for@x' 8 2月 2010 8日 月 火 水 木 金 土 8 1 2 3 4 5 6 8 7 8 9 10 11 12 13 814 15 16 17 18 19 20 821 22 23 24 25 26 27 828 8