Как мне отделить переменную от остального моего регулярного выражения Perl? - PullRequest
1 голос
/ 04 февраля 2009

У меня есть регулярное выражение, где переменная $m_strFirstName находится рядом с другими символами-идентификаторами, которые не являются частью имени переменной:

if($strWholeName =~ m/$m_strFirstName_(+)/) 
....

Я пытаюсь извлечь что-то вроде:

  • strWholeName - это 'bob_jones' или 'bob_smith'
  • m_strFirstName - это 'bob'
  • и мне нужна часть строки «кузнец» или «джонс».
  • если strWholeName равно "frank_jones", я хочу игнорировать это, поэтому утверждение if будет ложным

Очевидно,

m/$m_strFirstName_(+)/

не сработает, потому что интерпретатор regex не будет обрабатывать часть $ m_strname так, как я планировал, так что есть идеи?

РЕДАКТИРОВАТЬ: мой оригинальный вопрос не был ясным, обновлен.

Спасибо

Ответы [ 4 ]

5 голосов
/ 04 февраля 2009

Поставьте скобки вокруг имени вашей переменной:

if($strname =~ m/${m_strName}_(.+)/)
3 голосов
/ 05 февраля 2009
if ($strWholeName =~ m/^\Q$m_strFirstName\E_(.+)/)

Отличия от ответа Джоша Келли:

  1. Вы должны привязать регулярное выражение к началу строки, в противном случае, например, $strWholeName из "jeanne_smith" будет неправильно соответствовать $m_strFirstName из "anne".
  2. Вы должны окружить $m_strFirstName \Q и \E до указывать любые странные символы (если только вы не уверены, что они не могут появиться - но почему бы не сделать это, так как это дешево и гарантирует безопасность). Гинек Виходил упомянул об этом в комментарии к ответу Джоша.
3 голосов
/ 04 февраля 2009

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

my($strWholeName) = "Bob_Jones";
my($m_strFirstName) = "Bob";

if($strWholeName =~ m/$m_strFirstName_(.+)/) {
    print "Last name is <$1>\n";
}

, что привело к следующему:

C:\temp>perl test.pl
Last name is <Bob_Jones>

Если добавить две следующие строки:

use strict;
use warnings;

вместо этого вы получите следующий вывод:

C:\temp>perl test.pl
Global symbol "$m_strFirstName_" requires explicit package name at test.pl line
7.
Execution of test.pl aborted due to compilation errors.

Добавьте скобки за ответ Джоша, и вы, наконец, получите:

C:\temp>perl test.pl
Last name is <Jones>

Всегда, всегда, всегда use strict и use warnings!

См. Руководство Брайана по решению любой проблемы Perl из Освоение Perl для получения более изящных трюков.

2 голосов
/ 04 февраля 2009
$foo = "yodeling yoda"
$bar = "ing yo"

if ($foo =~ /\Q$bar\E/)
{
  print "true"
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...