Если Perl поддерживает утверждения с изменяемой шириной, вы можете сделать это примерно так:
split(/(?<!(?<!\\)(?:\\\\)*\\)\|/, $psv);
Это должно соответствовать символу канала, которому не предшествует (нечетное число обратных слешей, которым не предшествует обратный слеш). Но разрешены только утверждения с фиксированной шириной, поэтому это не вариант. Вполне возможно, что какой-то гуру регулярных выражений может предложить что-то, что действительно будет работать для вас, но лично я бы сказал, что конечный автомат (циклически проходящий через $psv
символ за раз) может быть лучшим вариантом.
Еще кое-что, что, я полагаю, вы могли бы попробовать - просто разбить строку на символе канала, а затем проверить каждый элемент результирующего списка, чтобы увидеть, заканчивается ли он нечетным числом обратных слешей. Если это так, присоедините его к следующему элементу списка с |
между ними. По сути, вы выполняете разделение, игнорируя escape-последовательности, затем возвращаетесь назад и учитываете escape-последовательности впоследствии.