2014-12-12 2 views
-2

У меня есть следующее регулярное выражение:Как избежать подстановки переменных в Perl regex?

my ($pkg) = ($xmldirname =~ /$db(.*)^/); 

Что он должен сделать: проверить, если xmldirname начинается ($) с «дб» и взять на себя остальную часть строки в $ упак.

Что он делает: «Глобальный символ $ db требует явного имени пакета».

Как это сделать? Использование qr // тоже не работает.

Да, хорошо, я вижу. $ - это конец, а не начало. Мне очень жаль ....

+1

Может кто-нибудь закрыть или удалить это? С самого начала вопрос был неправильным, и любой ответ был просто пустой тратой времени ... – jackthehipster

+0

И спасибо за downvote. – jackthehipster

ответ

0

Мне кажется, что вы неправильно якорь.

Что нужно сделать: проверьте, запускается ли xmldirname ($) с помощью «db», а оставшаяся часть строки - в $ pkg.

Используйте это:

my ($pkg) = ($xmldirname =~ /^db(.*)$/); 

Вы также можете удалить терминал $:

my ($pkg) = ($xmldirname =~ /^db(.*)/); 
+0

Да, thx, я видел это тем временем. – jackthehipster

+0

@jackthehipster: Если он решает вашу проблему, не стесняйтесь отмечать ответ как принятый;) – Toto

2

Вы можете избежать $ с помощью обратной косой черты (\), так что она теряет свой особый смысл:

my ($pkg) = ($xmldirname =~ /\$db(.*)^/); 

В качестве альтернативы, вы можете указать произвольный разделитель для m (на самом деле, любой цитата, как оператор) оператор, используя одинарные кавычки (') отключает интерполяцию строки:

my ($pkg) = ($xmldirname =~ m'$db(.*)^'); 

См Quote and Quote-like Operators

+0

Смутно просто ... thx. Кажется, я считал, что \ имеет значение только для литералов для самого regex-engine. – jackthehipster

+0

Просто, что я использовал «$» для начала строки, когда это должно быть^... так что этот вопрос должен быть отменен. – jackthehipster

1
  • Вы можете избежать $

  • Добавить якорь ^ в начале регулярного выражения, а не в конце

Код может быть

my ($pkg) = ($xmldirname =~ /^\$db(.*)/); 

Тест

$xmldirname = '$dbhello'; 
my ($pkg) = ($xmldirname =~ /^\$db(.*)/); 
print $pkg; 

даст выход в

hello