Я пытаюсь написать синтаксический анализатор для формата данных EDI, который представляет собой просто текст с разделителями, но в котором разделители определены в верхней части файла.
По сути, это набор split (), основанный на значениях, которые я прочитал вверху моего кода.
Проблема в том, что есть также пользовательский «escape-символ», который указывает, что мне нужно игнорировать следующий разделитель.
Например, если предположить, * является разделителем и? это побег, я делаю что-то вроде
use Data::Dumper;
my $delim = "*";
my $escape = "?";
my $edi = "foo*bar*baz*aster?*isk";
my @split = split("\\" . $delim, $edi);
print Dumper(\@split);
Мне нужно вернуть "aster * isk" в качестве последнего элемента.
Моя первоначальная идея заключалась в том, чтобы сделать что-то, где я заменяю каждый экземпляр escape-символа и следующего символа какой-нибудь нестандартной отображаемой непечатаемой последовательностью ascii, прежде чем вызывать свои функции split (), а затем другое регулярное выражение, чтобы переключить их обратно вправо значения.
Это выполнимо, но похоже на хак и станет довольно уродливым, как только я сделаю это для всех 5 различных разделителей. Каждый разделитель также потенциально является специальным символом регулярного выражения, что приводит к значительному экранированию в моих собственных регулярных выражениях.
Есть ли способ избежать этого, возможно, с помощью специального регулярного выражения, переданного моим вызовам split ()?