Perlでカレンダー

30分プログラム、その255。上(id:mzp:20080228:wday)で書いたことがやっぱり納得できないので、Perlで実装してみる。
たしかにそれっぽい値にはなるんだけど、1違う気がする。あと、元コードではうるう年の判定コードが間違っていることも発見。divとmodを間違えている予感。

使い方

$ perl cal.pl
                1  2
 3  4  5  6  7  8  9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29

ソースコード

#! /usr/bin/perl
# -*- mode:perl; coding:utf-8 -*-
#
# cal.pl -
#
# Copyright(C) 2008 by mzp
# Author: MIZUNO Hiroki / mzpppp at gmail dot com
# http://howdyworld.org
#
# Timestamp: 2008/02/29 22:19:26
#
# This program is free software; you can redistribute it and/or
# modify it under MIT Lincence.
#

use strict;
use warnings;
use POSIX qw(strftime);

my ($sec,$min,$hour,$mday,$mon,$year,$wday,$summer) = localtime();
$year += 1900;
my $length = (31,$year % 4 == 0 ? 29 : 28,31,30,31,30,31,31,30,31,30,31)[$mon];
my $skip = (7-($mday % 7)+$wday) % 7 + 1; # +1 ???

print '   ' x $skip;

my $col = $skip;
for(my $i = 1; $i <= $length; $i++){
  printf "%2d ",$i;
  if(++$col == 7){
    print "\n";
    $col = 0;
  }
}

print "\n";