>perl -wMstrict -le "my $line = 'CLASS A SOLD ON 17/11/10 FOR SETTLEMENT ON 22/11/10 @ 145.59993'; ;; my $date = qr{ \d\d / \d\d / \d\d }xms; ;; my ($tdate) = $line =~ m{ (?: PURCHASED | SOLD) \s+ ON \s+ ($date) }xmsg; print qq{tdate: '$tdate'}; ;; my ($sdate) = $line =~ m{ SETTLEMENT \s+ ON \s+ ($date) }xmsg; print qq{sdate: '$sdate'}; " tdate: '17/11/10' sdate: '22/11/10' #### >perl -wMstrict -le "use Data::Dumper; ;; my $date = qr{ \d\d / \d\d / \d\d }xms; my $sep = qr{ \s+ ON \s+ }xms; my @ops = qw(PURCHASED SOLD SETTLEMENT); my $op = join '|', map quotemeta, @ops; $op = qr{ $op }xms; ;; READ_LOOP: { ;; my $line = 'CLASS A SOLD ON 17/11/10 FOR SETTLEMENT ON 22/11/10 @ 145.59993'; ;; next READ_LOOP if not my %dates = $line =~ m{ ($op) $sep ($date) }xmsg; print Dumper \%dates; ;; } " $VAR1 = { 'SETTLEMENT' => '22/11/10', 'SOLD' => '17/11/10' };