2011-03-28 1 views
10

У меня есть строка, которую я хочу разбить. Но разделитель определяется во время выполнения, поэтому мне нужно передать его как переменную.Почему разделение на `` `(труба) работает не так, как ожидалось?

Нечто вроде my @fields = split(/$delimiter/,$string); не работает. Есть предположения?


Вход:

abcd|efgh|23 

Ожидаемый результат:

abcd 
efgh 
23 
+2

Ваш вклад, реальный объем производства, и ожидаемый результат будет очень полезной информации ... – Sean

+5

Вы не имеют "разделитель", у вас есть «разделитель». «Разделитель» обозначает пределы, т. Е. это на обоих концах, как двойные кавычки. «Сепаратор» находится между элементами, такими как «|» в вашем примере ввода. – tadmc

+0

Возможный дубликат [Как обрабатывать специальные символы в регулярном выражении Perl?] (Http://stackoverflow.com/questions/576435/how-do-handle-special-characters-in-a-perl-regex) – daxim

ответ

19

Вам нужно бежать разделитель, так как это специальный символ в регулярных выражениях.

Вариант 1:

$delimiter = quotemeta($delimiter); 
my @fields = split /$delimiter/, $string; 

Вариант 2:

my @fields = split /\Q$delimiter/, $string; 
+0

. Для получения дополнительной информации см. «Perldoc perlretut',' perldoc perlre' и поиск/\\ Q/и см. 'Perldoc -f quotemeta'. – shawnhcorey

+2

Аргумент 'split' не является разделителем, а разделителем. – tchrist

+0

Не в соответствии с 'perldoc -f split':« Все, что соответствует PATTERN, считается разделителем, разделяющим поля ». – Sean