Это сделает это. Хитрость в использовании расщепления при сохранении токена, на который вы разбиваете, заключается в использовании соответствия обратного просмотра нулевой ширины: split(/(?<=[;|])/, ...)
.
Примечание: ответ mctylr (в настоящее время самый высокий рейтинг) на самом деле не верен - он будет разбивать поля на новых строках, т.к. он работает только на одной строке файла за раз.
Ответ gbacon с использованием разделителя входных записей ($/
) довольно умный - он экономит пространство и время - но я не думаю, что хотел бы видеть его в рабочем коде. Помещение одного разделенного токена в разделитель записей, а другого - в разделение, кажется мне немного неочевидным (вы должны бороться с этим с помощью Perl ...), что усложнит поддержку. Я также не уверен, почему он удаляет несколько новых строк (что, я думаю, вы не спрашивали?) И почему он делает это только для конца записей, заканчивающихся на «|».
# open file for reading, die with error message if it fails
open(my $fh, '<', 'data.txt') || die $!;
# set file reading to slurp (whole file) mode (note that this affects all
# file reads in this block)
local $/ = undef;
my $string = <$fh>;
# convert all newlines into spaces, not specified but as per example output
$string =~ s/\n/ /g;
# split string on ; or |, using a zero-width lookback match (?<=) to preserve char
my (@strings) = split(/(?<=[;|])/, $string);