in reply to Pattern matching for extracting dates
Because your second regex (if ($day=~/\d{1}/)) clobbers $3. I'd rework the code somewhat to:
use strict; use warnings; my %datehash = ( jan => 1, feb => 2, mar => 3, apr => 4, may => 5, jun => 6, jul => 7, aug => 8, sep => 9, oct => 10, nov => 11, dec => 12 ); while (<DATA>) { chomp; my $data = lc $_; next unless $data =~ /(\D{3}) \s* (\d{1,2}) \s* (\d{4})/x; next unless exists $datehash{$1}; my $month = $datehash{$1}; printf "%04d%02d%02d\n", $3, $month, $2; } __DATA__ Oct 16 2004 11:09:19:943AM Mar 3 2007 10:30:31:170PM
Prints:
20041016 20070303
Note the use of \s to match any white space and that a greedy match is used because it makes no difference in this context. Note too that the /x flag is used so that white space can be used in the regex to make the different parts more obvious.
printf is a cleaner way of generating the string. If you want the assign the result to a variable use sprintf instead.
For future reference it is worth giving a stand alone runnable sample such as this so others can reproduce your problem easily.
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re^2: Pattern matching for extracting dates
by Anonymous Monk on Apr 16, 2007 at 13:06 UTC |