カレンダー・プログラムをさらに改良していきましょう。Version 0.1 と 0.2 では、コマンドラインでパラメータを入れなかった場合、エラーを返しましたが、Version 0.3 では、現在の月を表示し、現在日が何日かを示すようにしてみましょう。
これを実現するために必要なことは、Perl でローカルタイムを得ることと、現在日をカラーで表示する方法を知ることです。Perl でローカルタイムを得るには次の式を使います。($sec, $min, $hour, $date, $month, $year, $day) = localtime(time);カレンダープログラムで必要なのは $year, $month, $date の三つですが、$year は 1900年を 0 として計算しますので、2005年の場合、105 という価を返し、月は、0 〜 11 の価を返しますので、次の式で、日数計算のサブルーチンが理解できる価に戻しておかなくてはなりません。
$year = 2000 + $year - 100; $month++;そして、$year, $month, $date の価をメインルーチンに返してやれば、このサブルーチンは完成です。次がサブルーチンの全体です。
sub get_current_time(){ local ($sec, $min, $hour, $date, $month, $year, $day); ($sec, $min, $hour, $date, $month, $year, $day) = localtime(time); $year = 2000 + $year - 100; $month++; return ($year, $month, $date); }
メインルーチンで書き換えたのは 以下の部分です。以前は if(....){...., exit(0)} となっていましたので、次は if でもよかったのですが、今度は、elsif にしないと、うまく動きません。elsif は else if という意味ですが、else if や elseif とするとエラーになります。
($this_year, $this_month, $today) = &get_current_time(); if($ARGV[0] eq ""){ $year = $this_year; $month = $this_month; } elsif($ARGV[1] eq ""){ .... } else{ .... }$this_year, $this_month, $today には、現在日を表示する時に使うために、&get_current_time() で得られた現在年月日を入れておきました。
現在日はカラーで表示します。現在日をカラーで表示するにはエスケープシーケンスを使います。8進法でエスケープ記号は \033 で表しますので、エスケープシーケンスは \033[<コード>m というふうに書きます。<コード> に入る数字は次のとおりで、複数指定するには ; で区切ります。
|
|
スタイルとカラーを組み合わせて、下記のように表します。ボールドにした場合、カラーは薄くなります。カラーコードやスタイルコードを使ったあとは、\033[0m をつけてリセットしておかなくてはいけません。
print "\033[1;32mThis is bold and green.\033[0m"; print "\033[1;37;44mThis is bold and white on blue.\033[0m\n";
現在日をグリーンのボールド字体で表すように、表示サブルーチンに次の行を加えました。
$date = 1; while($date <= $last_date){ print " "; if ($date < 10){ print " "; } if ($year == $this_year and $month == $this_month and $date == $today){ print "\033[1;32m"; } print $date; print "\033[0m"; if(($first_day + $date -1) % 7 == 6){ print "\n"; } $date++; }