#!perl while () { chomp; print "for [$_]:\n"; # split on XX, but only when it's not in # single quotes. while (m% ((?:[^']*? # Some unquoted stuff (?:'[^']*')? # optional quoted stuff )*?) # many times, but non-greedy XX | # field separator, or (.+) %xg) # a non-blank final field { # field value should now be in defined($2)?$2:$1 my ($t1, $t2) = qw(undef undef); $t1 = "[$1]" if defined($1); $t2 = "[$2]" if defined($2); print "\t$t1\t$t2\n"; } } __END__ aXXbXXc abcd a little 'quote XX' quote stuff XX other #### for [aXXbXXc]: [a] undef [b] undef undef [c] for [abcd]: undef [a] undef [b] undef [c] undef [d] for [a little 'quote XX' quote stuff XX other]: [a little 'quote XX' quote stuff ] undef undef [ ] undef [o] undef [t] undef [h] undef [e] undef [r] #### #!perl while () { chomp; print "for [$_]:\n"; # split on XX, but only when it's not in # single quotes. while (m% ([^']*? # Some unquoted stuff (?:'[^']*' # optionally, quoted followed by [^']*?)*? )# unquoted stuff. non-greedy XX | # field separator, or (.+) %xg) # a non-blank final field { # field value should now be in defined($2)?$2:$1 my ($t1, $t2) = qw(undef undef); $t1 = "[$1]" if defined($1); $t2 = "[$2]" if defined($2); print "\t$t1\t$t2\n"; } } __END__ aXXbXXc abcd a little 'quote XX' quote stuff XX other #### -- @/=map{[/./g]}qw/.h_nJ Xapou cets krht ele_ r_ra/; map{y/X_/\n /;print}map{pop@$_}@/for@/