perl regex

Trent Shipley plug-discuss@lists.plug.phoenix.az.us
Wed, 26 Mar 2003 15:21:22 -0700


On Wednesday 2003-03-26 14:05, David A. Sinck wrote:
> \_ SMTP quoth Trent Shipley on 3/26/2003 13:33 as having spake thusly:
> \_
> \_  [very well explained answer]
> \_
> \_ my $first_datum      = m/$first_separator
> \_                                     [^:]
> \_                                     $middle_separator
> \_                                     /x;
> \_ my $middle_datum  = m/$middle_separator
> \_                                     [^:]
> \_                                     $middle_separator
> \_                                     /x;
> \_ my $last_datum     = m/$middle_separator
> \_                                     [^:]
> \_                                     \Z
> \_                                     /x;
>
> The only gotcha is that this assumes that there are but three fields.
>
> David

I assumed no such thing.

The overall logic (that I left out [oops]) was:

#####################

WHILE there is a next line, get it;

WHILE the line is not the empty string

if  first_datum found, then put it in some data structure (an array of hashes 
or array-of-arrays might be appropriate) elsif middle_datum, elsif 
end_dataum.

# If going line-by-line process the data here.
# nb, you might want to case-select for middle_datum in the first test for 
efficiency at the expenese of readability.

Throw away all the text you just matched.  
# If you wrote the code right the string gets shorter with each pass; hence, 
finite loop.

= pod
This can be done with 

use English; with $PREMATCH, $MATCH, $POSTMATCH 
or
$1, $2 etc.

But for efficiency it is better to use pos() and substr() or \G.
= cut

END-WHILE # got fields for this record
END-WHILE # got the records in this "file"