カレンダ−・プログラム(3)−カレンダー表示のサブル−チン

カレンダーの計算ができましたので、いよいよこれを画面に表示することにします。画面表示のサブルーチンは次の通りで、ここでは 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月のカレンダーが表示されるはずです。

[前のぺ−ジ] [目次] [次のぺ−ジ]