>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' };