2009-02-03 2 views
1

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

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

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

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

Очевидно,

m/$m_strFirstName_(+)/ 

не будет работать, так как интерпретатор регулярных выражений не будет относиться к часть $ m_strname, как я и предполагал, поэтому любые идеи?

EDIT: мой оригинальный вопрос был не ясен, обновлен.

Благодаря

+0

Не будет что-то вроде split() сделать трюк ==> my (undef, $ lname) = split (/ _ /, $ strname); – codelogic

ответ

5

фигурные скобки вокруг вашего имени переменной:

if($strname =~ m/${m_strName}_(.+)/) 
+0

Удивительный, это сработало! благодаря! – cbrulak

+0

Не должно быть m/$ {m_strName} _ (. +)/(Отсутствует точка) –

+0

Использование m/\ Q $ {m_strName} \ E_ (. +)/Должно быть более безопасным. –

2
$foo = "yodeling yoda" 
$bar = "ing yo" 

if ($foo =~ /\Q$bar\E/) 
{ 
    print "true" 
} 
+0

Я обычно использую \ Q ... \ E, потому что что-то о разрыве моих значков доллара и идентификаторов, с которыми они принадлежат, меня неправильно трогает. – Sniggerfardimungus

+0

+1 \ Q \ E - хорошая привычка вступать в интерполяцию в regexen во все времена. Только опустите их, если вы знаете, что вы действительно этого хотите. – ephemient

3

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

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!

См. brian's Guide to Solving Any Perl Problem от Мастерство Perl для более элегантных трюков.

+0

это отличный совет, спасибо! – cbrulak

3
if ($strWholeName =~ m/^\Q$m_strFirstName\E_(.+)/) 

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

  1. Вы должны якоря регулярного выражения к началу строки, в противном случае, например, a $strWholeName "jeanne_smith" будет неправильно соответствовать $m_strFirstName файла "anne".
  2. Вы должны окружать $m_strFirstName с \Q и \E к цитатой какие-то странные символы (если вы абсолютно уверены, что они не могут появиться - но почему бы не сделать это в любом случае, как это дешево и гарантирует безопасность). Hynek Vychodil упомянул об этом в комментарии к ответу Джоша.
Смежные вопросы