Regexp поиск и замена в качестве переменных в Perl - PullRequest
2 голосов
/ 08 февраля 2011

Я не могу найти решение этой проблемы, и это сводит меня с ума!

my $foo = qr/(\S+) (\X+)/;
my $bar = qr/$2/;

line =~ s/$foo/$bar/g 

Моя проблема в том, что $bar использует ранее определенное значение $2, а не (\X+).

Ответы [ 3 ]

5 голосов
/ 08 февраля 2011

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

my $foo = qr/(\S+) (\X+)/;
my $bar = '$2';             # no interpolation

$line =~ s/$foo/$bar/gee;   # first eval make $bar -> '$2', second replaces it 
1 голос
/ 08 февраля 2011

Полагаю, значение $ bar должно быть просто строкой, а не регулярным выражением. Qr // не выглядит прямо там.

0 голосов
/ 08 февраля 2011

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

my $foo = qr/(\S+) (\X+)/;
my $bar = sub { $2 }; # or my $bar = \&some_replace_function;

$line =~ s/$foo/$bar->()/ge;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...