in reply to My code seems messy...

PerlGrrl,
There are many ways to make your code look more pristine. They almost always involve trade-offs. One example would be to hide all your regexes in a subroutine or an object. Either of those approaches could be separated further by having a master subroutine/method that called each 1 regex specific routine in sequence stopping at first match. This allows you to add new matches relatively easy.
while ( <$fh> ) { my ($yr, $mon, $day) = parse_date($_); next if ! defined $yr; # ... }
Additionally, you probably want to have a look at Date::Manip's 'ParseDate', Date::Calc's 'Parse_Date', Date::Parse, and Regexp::Common::time for ideas on improving or expanding your matching criteria (possibly as a replacement)

Cheers - L~R