The char used for escaping certain characters inside quoted fields, by default the same character as the quote_char. (C<">). If quote_char is specified in the call to new() and escape_char is not, the escape_char becomes the same as the specified quote_char. A literal value for the quote character thus becomes "" if quote_char is " and '' if quote_char is ' and just " or ' if quote_char is specified as undef. However if the escape_char is specified in the call to new() as something else, that value will be used. These examples should all parse properly as a single CSV field: $csv = Text::CSV_XS->new(); $csv->parse(q["Joe ""the giant"" Jackson"]) or die $csv->error_input; $csv = Text::CSV_XS->new({ quote_char=>q['] }); $csv->parse(q['Joe ''the giant'' Jackson']) or die $csv->error_input; $csv=Text::CSV_XS->new({quote_char=>undef}); $csv->parse(q[17" monitor]) or die $csv->error_input; $csv = Text::CSV_XS->new({ quote_char=>q['], escape_char=>q[\\]}); $csv->parse(q['Joe \'the giant\' Jackson']) or die $csv->error_input; $csv = Text::CSV_XS->new({ escape_char => q[\\] }); $csv->parse(q["Joe \"the giant\" Jackson"]) or die $csv->error_input;