http://www.perlmonks.org?node_id=969892

Lotus1 has asked for the wisdom of the Perl Monks concerning the following question:

I found out that one of my programs wasn't parsing the field values correctly due to unexpected white space inside the field values. What I came up with works but seems cumbersome. I used a positive lookahead for the first three fields.

Any suggestions for how to improve this or a better approach?

#!/usr/bin/perl use warnings; use strict; while(<DATA>) { chomp; # original regex #if( /[A-Za-z]+\s*=\s*(\S*)\s*[A-Za-z]+\s*=\s*(\S*)\s*[A-Za-z]+\s* +=\s*(\S*)\s*[A-Za-z]+\s*=\s*(\S*)/i ) { # Now trying to allow spaces in the fields without gobbling the fi +eld names (which never have spaces) # This is getting cumbersome quickly. if( /^[A-Za-z]+\s*=\s*(.+?)(?=\s*[A-Za-z]+\s*=)\s*[A-Za-z]+\s*=\s* +(.+?)(?=\s*[A-Za-z]+\s*=)\s*[A-Za-z]+\s*=\s*(.+?)(?=\s*[A-Za-z]+\s*=) +\s*[A-Za-z]+\s*=\s*(.+?)\s*$/ ) { print "$1,$2,$3,$4\n"; } else { print ",,,,not recognized: $_\n"; } } __DATA__ FIELDA = ONEAL FIELDB = RELAY FIELDC = L1208 FIELDD = ALTS FIELDA = OSSIPEE FIELDB = DISC FIELDC = SOH: 169879251 FIELDD = DISC FIELDA = OSSIPEE FIELDB = RELAY FIELDC = L1201 FIELDD = ALTS FIELDA = OSSIPEE FIELDB = RELAY FIELDC = L1203 FIELDD = ALTS

Here is the desired output.

ONEAL,RELAY,L1208,ALTS OSSIPEE,DISC,SOH: 169879251,DISC OSSIPEE,RELAY,L1201,ALTS OSSIPEE,RELAY,L1203,ALTS