use Data::Dumper; use IO::Scalar; use Text::CSV; my $data = "Alice,123\r\n" . "Bob\nSmith,456\r\n"; my $io = IO::Scalar->new(\$data); $/ = "\r\n"; my $CSV = Text::CSV->new({ eol => $/, sep_char => q{,}, binary => 1, }); while (defined(my $line = <$io>)) { $line =~ s/\n(.)/\xFF$1/g; $CSV->parse($line); my @row = map { s/\xFF/\n/g; $_ } $CSV->fields; print Dumper(\@row); }