Использование буферов захвата в регулярном выражении Perl, хранящемся в переменной - PullRequest
2 голосов
/ 19 августа 2010

Я получаю левую и правую части замены регулярного выражения в качестве аргументов функции. Я хочу, чтобы мои пользователи могли использовать буферы захвата, но это не работает так, как я пытаюсь это сделать.

my $string = "This is my string";

$string = regex_replace($string,'is (my) string','$1');

print "$string\n";

sub regex_replace {
    my ( $string,$left,$right ) = @_;

    $string =~ s/$left/$right/gsm;

    return $string;
}

Выполнение этого вывода «This $ 1» вместо «This my», которое я пытаюсь получить. Есть ли способ выполнить то, что я пытаюсь сделать здесь?

Ответы [ 2 ]

2 голосов
/ 19 августа 2010

Если вы хотите избежать использования eval ...

my $string = "This is my string";

$string = regex_replace($string,'is (my) string','$1');

print "$string\n";

sub regex_replace {
    my ( $string,$left,$right ) = @_;

    $string =~ /$left/g;
    $rv = $1;
    $right =~ s/\$1/$rv/;

    $string =~ s/$left/$right/gsm;

    return $string;
}
0 голосов
/ 19 августа 2010

В regex_replace, вы можете использовать

eval "\$string =~ s/$left/$right/gsm";

, но eval STRING дает людям хиби-джиби.

В вашем примере вывод

This my
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...