package calendarz; use Time::Local; my %cached; #to build a calendar - you need a cycle for the months for the specific year. sub dayscounter { # month is from 1 to 12 my $month = shift; my $year = shift; my @montosun; if (! exists $cached{$year}{$month}){ my %daycount; my $daysinmonth = lastday($month,$year); #print $daysinmonth; for my $dom (1..$daysinmonth) { my $thetime = timelocal(0, 0, 0, $dom, $month-1, $year); my $dayofweek = (localtime($thetime))[6]; $daycount{$dayofweek}++; } $daycount{7} = $daycount{0}; delete $daycount{0}; push @montosun ,$daycount{$_} foreach (sort keys %daycount); $cached{$year}{$month} = \@montosun; } else { @montosun = @{$cached{$year}{$month}}; } return @montosun; } ################################################ sub lastday { my $month=shift; my $year= shift; $month--; my @days = (31,0,31,30,31,30,31,31,30,31,30,31); if($days[$month]){ return $days[$month]; } else { # It's Feb, test for leap year if($year % 4 != 0){ return 28; } elsif($year % 400 == 0){ return 29; } elsif($year % 100 == 0){ return 28; } else { return 29; } } } ################################################ 1;