The solution really boils down to a choice between:
use Text::CSV;
Rewrite Text::CSV in your own words, and then slowly rediscover and re-solve all the unexpected tricky bits while providing support for who knows how long.
Comment on Re^3: Semicolon delimited to Comma delimited