package mycalendar; use strict; sub is_leap { my $Y = shift; return ((($Y % 4) == 0) && ((($Y % 100) != 0) || (($Y % 400) == 0))); } # # 年,月が持つ最大の日 # sub maxdayof { my $Y = shift; my $M = shift; $M -= 1; my @days = ( 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ); return $days[ $M ] + (($M == 1) && &is_leap($Y)); } # # ツェラーの公式による # 0..sun 6..sat # sub weekof { my $Y = shift; my $M = shift; # 1--12 my $D = shift; $D = 1 unless $D; if ( $M <= 2 ) { $Y -= 1; $M += 12; } return ($Y + int($Y/4) - int($Y/100) + int($Y/400) + int((13 * $M + 8) / 5) + $D) % 7; } # # 描画 # sub draw { my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime( $_[0] || time ); $year += 1900; $mon++; my $maxday = &maxdayof( $year, $mon ); my $d = 1 - &weekof( $year, $mon, 1 ); my $w = 0; my @wclass = qw( CalSun CalMon CalTue CalWed CalThu CalFri CalSat ); print qq[
| ], $_, qq[ | ]; } print "
|---|
| ]; if ( 1 <= $d && $d <= $maxday ) { if ( $d == $mday ) { print qq[$d]; } else { print $d; } } else { print ' '; } print qq[ | ]; $d++; $w++; if ( 7 <= $w ) { print "