日付のチェックをする関数です。

sub isValidDate{
    local($year, $mon, $day) =@_;
    # $year 4桁の西暦
    # $mon  月を表す1〜12の整数
    # $day  日付

    # 簡単なチェック
    return 0 if $year < 1701 # 英では1700年は閏年。
             || $year > 9999 # まあここは適当に。
             || $day  <    1
             || $day  >   31;
    # $monは間違っていたら以下の$lastdayが0になるのでチェック不要。

    # その月の末日を計算(2行目は閏年の計算)
    local($lastday) = (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31)[$mon - 1]
         + ($mon == 2 && ($year % 4 == 0 && $year % 100 != 0 || $year % 400 == 0
));
    # $day が $lastday 以下ならOK。
    ($day <= $lastday) ? 1 : 0;
}

とかでどうでしょ?これで日付が正しいなら1、間違っていれば0を返すはずです。