引数で年と月を渡すと、その月の最後の日を返すサブルーチンです。月ごとや日ごとの集計を、それぞれリンクさせたりする必要があるときに役立ちます。追加モジュールとか使えばもっと簡単なのかもしれないけど、できるだけ標準モジュールを使って、環境に依存しないソースコードを書くためのもの。
# 年と月から最後の日を返す sub last_day_of_month { my ($year, $month) = @_; # うるう年を考えない場合の、月の最終日のリスト my @lastday = (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31); # 月が1から12でないならこの時点でゼロを返す if ($month < 1 || 12 < $month) { return 0; } # 2月の場合、閏年であれば日数を増やす if ($month == 2) { if ( (($year % 4 == 0) && ($year % 100 != 0)) || ($year % 400 == 0) ) { $lastday[1]++; } } # 月の最終日のリストのうち、必要なものを返す return $lastday[$month - 1]; }
閏年については、西暦が4の倍数の年であれば2月の日数を1日増やしますが、西暦が4の倍数の年でも100の倍数の年は閏年にならないので除外します。また西暦が100の倍数の年でも、400の倍数の年の場合は閏年になるので、この場合は2月の日数を1日増やします。
引数の渡し方は、以下のような感じ。この場合print関数が「31」を出力します。
my $last_day = &last_day_of_month(2007, 07); print $last_day;
Comments