2016-10-12 7 views
0

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

my $pattern = '`(.*?)`'; 
$string =~ s{$pattern}{<code/>$1</code>}im; 

Но вместо передачи <code/>$1</code> непосредственно заменить, я хочу, чтобы сохранить его в качестве переменной (которая может отложить в зависимости от типа данные я хочу, чтобы захватить)

my $pattern = '`(.*?)`'; 
my $replace = '<code/>$1</code>'; #or my $replace = '<code/>$2</code>' 
$string =~ s{$pattern}{$replace}im; 
+0

Вы в основном получили его здесь. Замените эти одинарные кавычки двойными кавычками, чтобы заставить их работать так, как вы хотите. ''a $ 1''! =' 'a $ 1" '- в первом нет интерполяции, но есть во втором. –

+0

Я не получаю его, когда я использую '' '' он не работает. –

ответ

0

в this post, Jenda предлагает решение, которое может быть применимо к вашему делу. Он включает в себя создание подпрограммы, а затем оценку субрежима для регулярного выражения.

#!/usr/bin/perl 
use strict; 
use warnings; 

my $pattern = '`(.*?)`'; 
my $replace = '<code/>$1</code>'; 
my $code = 'sub {$_[0] =~ s{$pattern}{'. $replace . '}ig}'; 
my $re = eval $code; 

my $string = "Here `is` a string"; 
$re->($string); 

print $string; 

Печатается Here <code/>is</code> a string

Надеются, что это полезно.

+0

Если '$ replace' испорчен (т. Е. Содержит входные данные из внешнего мира), это уязвимо для ввода кода. '$ replace = '}; напечатайте «Gotcha! \ n»; m {'' – Schwern

+0

@Schwern Спасибо, что указали это. Я не упомянул об этом и предположил, что это произойдет только из внутреннего источника. –

Смежные вопросы