Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > Почему split не работает без экранирования шаблона


Автор: Perlfan 20.11.2014, 12:28
Код

# Пример № 1
$var1 = "abc~def~ghi~jkl~mno";
$delimiter1 = '~';

@data1 = split (/$delimiter1/, $var1);

foreach (@data1) {
print "$_<br>\n";
}

# Пример № 2

$var2 = "abc|def|ghi|jkl|mno";
$delimiter2 = '|';

@data2 = split (/$delimiter2/, $var2);

foreach (@data2) {
print "$_<br>\n";
}

Два одинаковых кода, но первый работает как ожидается, а второй нет. В книге "Программирование на Perl" 3-е издание на 859 странице написано, что можно использовать конструкцию /$variable/o, но в данном случае (пример 2) она не работает. Необходимо добавлять "\". Есть ли какой-то способ заставить конструкцию split /$variable/ работать без этого? Пробовал разные ограничители шаблона, но всё равно с "|" фокус не проходит. Как быть, если неизвестно, что за разделитель использует клиент? Может быть ещё какие-то знаки, кроме "|" тоже будут глючить?

Заранее спасибо за советы!

Автор: arto 20.11.2014, 12:33
первый аргумент у spit -- регулярное выражение

perldoc -f split
perldoc perlre

# perl -le '$a = "|"; print join "\n", split /\Q$a\E/o, "abc|def|ghi|jkl|mno"'
abc
def
ghi
jkl
mno

Автор: Perlfan 20.11.2014, 13:37
arto, спасибо! Что-то я упустил из вида \Q.

Автор: noize 21.11.2014, 22:12
можно ещё воспользоваться оператором qr для подготовки шаблона регулярки.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)