my $month_abv = qr/[[:upper:]][[:lower:]]{2}/; my @date_patterns = ( # Mar 11 2011 08:02:08.32 ['Mmm DD YYYY HH:MM:SS.uu', qr/$month_abv \s+ \d\d? \s+ \d{4} \s+ \d\d:\d\d:\d\d\.\d\d /x], # Mar 11 2011 08:02:08 ['Mmm DD YYYY HH:MM:SS', qr/$month_abv \s+ \d\d? \s+ \d{4} \s+ \d\d:\d\d:\d\d /x], # Mar 11 08:02:08.32 ['Mmm DD HH:MM:SS.uu', qr/$month_abv \s+ \d\d? \s+ \d\d:\d\d:\d\d\.\d\d /x], # Mar 11 08:02:08 ['Mmm DD HH:MM:SS', qr/$month_abv \s+ \d\d? \s+ \d\d:\d\d:\d\d /x], ); my $line = q{ Mar 11 08:02:08 172.28.17.253 Mar 11 2011 08:02:08 D+R-FW-1 : Jan 1 2011 00:00:00.07; }; DATE: until ($line =~ /\G\z/gc) { foreach my $pat (@date_patterns) { my($form, $re) = @$pat; if ($line =~ /\G\b($re)\b/gc) { say "Matching date form '$form': $1"; next DATE; } } $line =~ /./sgc; # no matches, bumpalong }