2012-08-09 2 views
0

Я новичок в Perl, но мне было интересно, что произойдет, если я создам переменную регулярного выражения с захватами или даже другие виды побочных эффектов, таких как утверждения кода, а затем используйте интерполяция, чтобы вставить это регулярное выражение в большую регулярную форму, а затем повторить этот процесс еще раз?Perl: составление регулярного выражения через интерполяцию, когда subexpr имеет захват

Неужели это беспорядок или даже возможно контролировать то, что окончательная композиция действительно делает с точки зрения поведения побочных эффектов? Есть ли документация по этому поводу?

+3

Добро пожаловать на Perl! Можете ли вы привести пример того, что вы подразумеваете в коротком фрагменте кода? Думаю, я мог бы знать, о чем вы спрашиваете, но это могло бы быть лучше без моих предположений. – zostay

+2

Если вам интересно, продолжайте и попробуйте. Обучение через пробную версию и ошибки намного лучше, чем кому-то передать вам ответ. –

+0

Что касается захвата, если вы используете именованные фрагменты (а не пронумерованы), и у вас нет именных коллизий, то это должно случиться в общем и крайне отрицательном смысле. –

ответ

-1

Вы имеете в виду вот это?

Yup, вы можете.

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

my $re_name = qr(^) . qr(bob) . qr(\s); 
while ($name_from_file = <STDIN>) { 
    chomp $name_from_file; 
    if ($name_from_file =~ /$re_name/i) 
    print "I got something for $name!\n"; 
} 

Таким образом, регулярное выражение может легко интерполировать переменную.

0

На этом есть много documentation, и он поставляется с Perl. :)

Во-первых, интерполяция происходит до того, как Perl обрабатывает символы для шаблона. Understand the order of operations in double quoted contexts. Любые специальные символы внутри интерполированной строки по-прежнему являются особенными.

Чтобы ответить на ваш вопрос, вам просто нужно попробовать.

use v5.10; 

my $start = qr/(Buster|Mimi)/; 
say "Starting regex --> $start"; 

my $middle = qr/My (cat is $start)/i; 
say "Middle regex --> $middle"; 

my $end = qr/Find \s+ "$middle"/x; 
say "End regex --> $end"; 

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

Starting regex --> (?^:(Buster|Mimi)) 
Middle regex --> (?^i:My (cat is (?^:(Buster|Mimi)))) 
End regex --> (?^x:Find \s+ "(?^i:My (cat is (?^:(Buster|Mimi))))") 

Правила захвата одинаковы на каждом уровне. Они определяются порядком открытия скользящих скобок. Perl не заставляет вас следить за каким-либо гнездом или «кто первым попал туда». Если вы не хотите отслеживать пронумерованные захваченные переменные, вы можете использовать именованный захват.