カレンダ−・プログラムの改良(3)−現在日の表示

カレンダー・プログラムをさらに改良していきましょう。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 というふうに書きます。<コード> に入る数字は次のとおりで、複数指定するには ; で区切ります。

文字色背景色
3040
3141
3242
3343
3444
3545
3646
3747
 
スタイルコード
リセット0
太字1
通常2
斜体3
下線4
ブリンク5
速いブリンク6
反転7
透明8

スタイルとカラーを組み合わせて、下記のように表します。ボールドにした場合、カラーは薄くなります。カラーコードやスタイルコードを使ったあとは、\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++;
    }

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