perl -wMstrict -e "my @months = (qw(jan feb mar apr may jun jul aug sep oct nov dec)); my $i = 1; my %month_num = map { $_ => $i++ } @months; my $month_re = join '|', @months; print qq(o/p: \n); for (@ARGV) { print qq( $_: ); s/($month_re)\w+/$month_num{$1} || $1/ei; print qq($_ \n) }" jan JaN january jane o/p: jan: jan JaN: JaN january: 1 jane: 1 #### perl -wMstrict -e "my @months = (qw(jan feb mar apr may jun jul aug sep oct nov dec)); my $i = 1; my %month_num = map { $_ => $i++ } @months; my $month_re = join '|', @months; print qq(o/p: \n); for (@ARGV) { print qq( $_: ); s/($month_re)\w*/$month_num{lc $1} || $1/ei; print qq($_ \n) }" jan JaN january jane o/p: jan: 1 JaN: 1 january: 1 jane: 1 #### use warnings; use strict; MAIN: { my $month_rx = month_names_regex(); while () { s{ ($month_rx) }{ "$1 (@{[ month_number($1) ]})" }xmseg; print; } } BEGIN { # compile-time initialized closure for month-number regexes my %months; # start with long names of months, pair with month number strings. # month numbers: two digits with leading zero if needed. # all month names in common lower case. @months{ qw( january february march april may june july august september october november december ) } = map { sprintf '%02d', $_ } 1 .. 12; # generate short month names, pair with long month numbers. my $months_re = join ' | ', map { my ($short_name, $regex) = mon_split($_); $months{$short_name} = $months{$_}; $regex; } keys %months ; # return final long/short month name regex. sub month_names_regex { return qr{ \b (?: $months_re) \b }xmsi } # convert long/short month name to month number. sub month_number { my $name = shift; return $months{lc $name} } # printf "\$months_re is %s \n", month_names_regex(); # FOR DEBUG # print "$_ => $months{$_} \n" for keys %months; # FOR DEBUG sub mon_split { my ($mon_name, ) = @_; my ($head, $tail) = $mon_name =~ m{ \A (\w{3}) (\w*) \z }xms; die "malformed month name $mon_name" unless $head; $tail = qr{ (?: $tail)? }xmsi if $tail; return (lc $head, qr{ $head $tail }xmsi); } } # end compile-time initialized closure for month-number regexes __DATA__ jan january february feb mar march jUnE JuN JuLy JUL xMaY xmArx Marx xmay xmayx mayx xjunE xjunex xJUNEx xjun xJUNx jUnx and so on #### jan (01) january (01) february (02) feb (02) mar (03) march (03) jUnE (06) JuN (06) JuLy (07) JUL (07) xMaY xmArx Marx xmay xmayx mayx xjunE xjunex xJUNEx xjun xJUNx jUnx and so on