Another way (note variables $tdate $sdate are undefined, hence easy to test, if no match exists):
>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'
See also perlretut, perlrequick, perlreref.
Update: Or even (hash %dates empty if no match):
>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'
};
|