my $term = qr/"[^"\\]*(?>\\.[^"\\]*)*"|[^,"]*/; #### my $term = qr/"[^"]*(?>""[^"]*)*"|[^,"]*/; #### /^$term,$term,$term,($term)/o; #### my $term = qr/"[^"\\]*(?>\\.[^"\\]*)*"|[^,"]*/; while () { /^$term,$term,$term,($term)/o and print "$1\n"; } __DATA__ 6,0,3,"8.1",1 7,578,,"8.2,r1",1 8,0,5,"8.2,r3",1 18,0,13,"6.2",1 19,D610,,"6.3,r1",1 20,2f78,15,"6.3,r2",1