NeoNox, он имел в виду, что точка с запятой экранируется кавычками.
Я бы сделал проходом строки по символу в цикле считая кавычки - т.е. если кавычки открыты не разбивать по \';\', а если закрыты - то выделить с пред. \';\' по substr.
Ну и конечно есть
Text::CSV и DBD::CSV - можно посмотреть как они написаны.