use strict; use Data::Dumper; while () { chomp; my @rec; # was - foreach (split /"(.*,.*)"|,/) ... foreach (split /"((?:\\"|.)*?)"|,/) { push @rec, $_ if $_ } print Dumper(\@rec); } __DATA__ 1,"Hello, world",This is good,2 121212,"Simpson, Bart",Springfield,"Roger" 121212,"2\" tape, \"white",springfield,"Roger" 121212,"Simpson \", Bart",Springfield,"Roger" #### $VAR1 = [ '1', 'Hello, world', 'This is good', '2' ]; $VAR1 = [ '121212', 'Simpson, Bart', 'Springfield', 'Roger' ]; $VAR1 = [ '121212', '2\\" tape, \\"white', 'springfield', 'Roger' ]; $VAR1 = [ '121212', 'Simpson \\", Bart', 'Springfield', 'Roger' ]; #### use strict; use Data::Dumper; while () { chomp; my @rec; foreach (split /"(.*?)(?:(?## $VAR1 = [ '1', 'Hello, world', 'This is good', '2' ]; $VAR1 = [ '121212', 'Simpson, Bart', 'Springfield', 'Roger' ]; $VAR1 = [ '121212', '2" tape, "white', 'springfield', 'Roger' ]; $VAR1 = [ '121212', 'Simpson ", Bart', 'Springfield', 'Roger' ]; $VAR1 = [ '121212', '2"', 'springfield', 'Roger' ];