Как я могу разделить строку вдоль предоставленного пользователем разделителя строк в Perl?
Вопрос
Мой код работал нормально, и теперь он ломается. Проблема заключается в следующем: я хочу разделить исходную строку (из базы данных, но это не важно) на разделитель. Разделитель не является фиксированным, но предоставляется пользователем в виде строки. Раньше я делал это:
@results = split($splitString, $sourceStr);
Но это ломается, когда пользователи запрашивают знак плюс (+) в качестве разделителя. Сообщение немного загадочное:
Quantifier follows nothing in regex; marked by <-- HERE in m/+ <-- HERE
Насколько я понимаю, он ломается, потому что split не ожидает строку, а регулярное выражение. Тем не менее, я не могу найти способ избежать $ splitString таким образом, чтобы он работал. Вот мой игрушечный пример:
my $s = 'string 1 + $splitChar + string 2';
my $splitChar = "+";
my @result = split(/\\$splitChar/, $s);
print "num of results ".scalar(@result)."\n";
foreach my $value (@result) {
print "$value\n";
}
Но это совсем не раскололось. Я попробовал несколько вариантов, ни один из которых не работал. Обратите внимание, что указанный пользователем разделитель, вероятно, ограничен одним символом, но многосимвольное решение было бы лучше.
(и да, я мог бы написать свою собственную специализированную функцию разбиения, но это не главное).
( $ splitChar
в примере с одиночной кавычкой специально, я думаю, понятно почему).
Решение
Первый аргумент split
- это шаблон
#!/usr/bin/perl
use strict;
use warnings;
my $sep = '+';
my $source = 'one+two+three';
my @results = split /\Q$sep\E/, $source;
use Data::Dumper;
print Dumper \@results;
Другие советы
Проблема в том, что + используется в качестве метасимвола для обозначения «одного или нескольких» из предыдущих элементов (поэтому вы запрашиваете один или несколько, не указывая, что именно вы хотите)
Ответ Синан - хороший, также проверьте функцию quotemeta . . р>