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"