2012-06-13 3 views
0

Учитывая переменные:Perl регулярное выражение строится из значений переменных

my $var1 = "fish"; 
my $var2 = "ocean"; 

Мои входные строки могут быть либо fishin_ocean или fishout_ocean.

Как написать регулярное выражение Perl для соответствия как входным строкам, где части регулярного выражения находятся в $var1 и $var2? Это одна (где строка находится в $var3) не возвращает либо из вышеуказанных строк:

$var3 =~ /$var1.+?$var2/; 

Edit от ответа OP в:

Я думаю, что это особый квадрат Braket в конце, что вызывает проблему

my $a = "slash_wideiscan"; my $b = "_mnn3h_reg[0]"; 
    my @array1 = qw (slash_wideiscanps_mnn3h_reg[0] 
        slash_wideiscanptlr_mnn3h_reg[0] 
        slash_wideiscanps_mnn0h_reg); 
    for my $element (@array1) { 
     if ($element =~ /($a.+?$b)/) { 
      print "YES : $element\n"; 
     } else { 
      print "NO : $element\n"; 
     } 
    } 

ответ, который вернулся был

NO : slash_wideiscanps_mnn3h_reg[0] 
    NO : slash_wideiscanptlr_mnn3h_reg[0] 
    NO : slash_wideiscanps_mnn0h_reg 

Я на самом деле хочу

YES : slash_wideiscanps_mnn3h_reg[0] 
    YES : slash_wideiscanptlr_mnn3h_reg[0] 
    NO : slash_wideiscanps_mnn0h_reg 
+0

Что именно вы пытаетесь достичь? Оператор сопоставления не возвращает строку в скалярном контексте. – choroba

+0

Добро пожаловать в StackOverflow. Обратите внимание, что мы ценим четкие вопросы. См. [FAQ] (http://stackoverflow.com/faq). Я отредактировал этот вопрос для вас, но я, возможно, неправильно понял, что вам нужно. Если это так, вы должны повторно отредактировать вопрос, чтобы он отражал то, что вы действительно спрашиваете. –

+0

Вы должны использовать собственные имена для своих переменных. Это облегчит вашу жизнь. – TLP

ответ

0

Это должно работать:

/fish(in|out)_ocean/ 
+0

К сожалению, может быть тонна вещей после того, как рыба не просто «в» или «вне». Именно поэтому я попробовал подстановочный знак –

+0

. Меня отбросили: «Мои строки ввода могут быть либо fishin_ocean, либо fishout_ocean». – gpojd

1

Не совсем понятно, что вы ищете, но вот ваше регулярное выражение в действии:

my $fish = "fish"; 
my $ocean = "ocean"; 

for my $word ("fishin_ocean", "fishout_ocean") { 
    if ($word =~ /($fish.+?$ocean)/) { # parens capture to $1 
     print "Word $word matches\n"; 
     print "The matching part is: $1\n"; # $1 contains the captured text 
    } 
} 

Подробнее в perldoc perlretut и perldoc perlre

0

Вы regex в порядке. Проблема в том, что вы думаете, что регулярное выражение возвращает согласованную строку, но на самом деле она возвращает только true или false (если она соответствует или не соответствует).

Если вы хотите зафиксировать совпадение, используйте круглые скобки вокруг части, которую вы хотите захватить. Захватывает хранятся в порядке, в $ 1, $ 2, $ 3, и т.д. ...

my ($var1, $var2, $var3) = ("fish", "ocean", "fishin_ocean") 

$var3 =~ /($var1)(.+?$var2)/; # only returns true or false 
print $1;      # prints fish 
print $2;      # prints in_ocean 
0

Согласно вашему ответу (который должен быть обновление на ваш вопрос), бежать каждую часть вашего регулярного выражения с \Q\E вроде следующего:

my $a = "slash_wideiscan"; 
my $b = "_mnn3h_reg[0]"; 
my @array1 = qw (slash_wideiscanps_mnn3h_reg[0] 
       slash_wideiscanptlr_mnn3h_reg[0] 
       slash_wideiscanps_mnn0h_reg); 
for my $element (@array1) { 
    if ($element =~ /(\Q$a\E.+?\Q$b\E)/) { 
       here___^ ^^^
     print "YES : $element\n"; 
    } else { 
     print "NO : $element\n"; 
    } 
} 

выход:

YES : slash_wideiscanps_mnn3h_reg[0] 
YES : slash_wideiscanptlr_mnn3h_reg[0] 
NO : slash_wideiscanps_mnn0h_reg 
Смежные вопросы