use Time::Local qw( timelocal ); my $date_str = '2-31-2006'; my ($m, $d, $y) = $date_str =~ /^(\d+)-(\d+)-(\d+)$/ or die("Invalid input format. Use day-month-year.\n"); my $time = eval { timelocal(0, 0, 0, $d, $m-1, $y) } or die("Invalid date: $@\n"); # For Time::Local < 1.04. Perl >= 5.8.0 doesn't need this. (localtime($time))[3] == $d or die("Invalid date\n");