カレンダーの計算ができましたので、いよいよこれを画面に表示することにします。画面表示のサブルーチンは次の通りで、ここでは print というファンクションを使っています。
sub show_a_month(){ print "$month/$year\n"; print " Su Mo Tu We Th Fr Sa\n"; my $i = 0; while($i <= $first_day - 1){ print " "; $i++; } $date = 1; while($date <= $last_date){ print " "; if ($date < 10){ print " "; } print $date; if(($first_day + $date -1) % 7 == 6){ print "\n"; } $date++; } print "\n"; }
print は、変数や、変数を含む文字列でも、含まない文字列でも、それを画面に表示させます。もっと正確にいえば、「標準出力」に書き出すのです。
$ calender.pl > calender.txtというふうに、システムのリダイレクト機能を使えば、ファイルに書き出してもくれるわけですから。
次の print 文で、最後に \n としるされているのは、改行記号で、もし、改行記号をいれないでおくと、最初の行と次の行はくっついて、一行で出力されてしまいます。\n のような「特殊文字」(メタキャラクター)は、他に \t (タブ) が良く使われます。
print "$month / $year\n"; print " Su Mo Tu We Th Fr Sa\n";
一ヶ月のカレンダーの表示プログラムを書く前に、次のような図を描いてみました。日数は最大 2桁ですので、隣との間隔もいれて、1日分に 3桁 をあてました。1日が水曜日からはじまる場合は、最初の3日にスペースを三つ入れ、1〜9日には、スペース二つと日付、10〜31日にはスペース一個と日付を表示させることにしました。
Su | Mo | Tu | We | Th | Fr | Sa |
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
my $i = 0; while($i < $first_day){ print " "; $i++; }$first_day というのは、その月の 1日の曜日コードです。その日までの部分はスペース 3個の空白で埋めました。
次に 1日から最後の日(28、29、30、31 のいずれか)までを順に表示していきます。どの日にも空白一個はかならず必要なので、while(....){ 以下の最初に print " "; が出てきます。
$date = 1; while($date <= $last_date){ print " ";日付が 10日以下は、もう一個空白が必要なので
if ($date < 10){ print " "; }としました。if(....){....} は「もし (....) なら {....} せよ」という条件文で、() や {} は欠かせません。{} の中がたとえ一行でも、{} でくくらないと、エラーになります。
そして、そのあとに print $date; で日付を入れていけばいいのですが、土曜日には改行しなければなりません。土曜日のコードは 6 ですので、その日が土曜日かどうかを if(....) 文で調べて、もしそうなら、{ print "\n"; } として改行記号をいれました。
print $date; } if(($first_day + $date -1) % 7 == 6){ print "\n"; } $date++; }全部表示しおわったら、print "\n"; でもうひとつ改行記号をいれておきました。こうしないと、コンソールのプロンプトが行のはじめに表示されないからです。
これで、全部のプログラムを書き終えましたので、calendar.pl という名前で保存します。保存する時、文字コードは EUC、改行は LF のみであることを確認します。保存が終わったら $ chmod +x calendar.pl で実行属性をつけて、$ ./calender.pl としてみます。すると、2002年4月のカレンダーが表示されるはずです。