$ & не разрешается как часть замены perl - PullRequest
1 голос
/ 26 февраля 2020

У меня есть скрипт perl, который ищет и заменяет данные в нескольких файлах. Поскольку в файле можно заменить более одного слова, я написал функцию, которая принимает шаблоны поиска и замены в виде массивов. Затем я l oop над массивами в этой функции и выполнить замену. Это работает хорошо, но только для одного конкретного файла, мне нужно добавить что-то перед соответствующей строкой (символ #). Следовательно, я передаю "# \ $ &" как шаблон замены. Получено правильно, но каким-то образом $ & никогда не разрешается. Вместо этого операция заменяет совпавшую строку литеральным значением '# $ &'. То же самое работает, если я непосредственно использую # $ & в моей команде подстановки в функции readFile. Я знаю, что мы можем достичь результата другими способами, но я действительно хочу знать, почему тот же шаблон замены работает при прямой передаче, в то время как он не работает при чтении в качестве элемента массива. Я прокомментировал команду замещения, которая хорошо работает для справки. Кто-нибудь может помочь мне определить проблему здесь?

my @search= ("host\\s*(replication|all)");
my @replace= ("#\$&");

my $sLine = scalar @search;
my $rLine = scalar @replace;

my $data = ???;

for ( my $i=0; $i < $sLine; $i++)
{
     print("\n search = $search[$i]  replace = $replace[$i] \n");
     #$data =~ s/$search[$i]/#$&/g; ==> this works
     $data =~ s/$search[$i]/$replace[$i]/g; #==> this doesn't
}

print($data);

1 Ответ

2 голосов
/ 26 февраля 2020

Разница между рабочим и нерабочим решениями такая же, как разница между

print "#$&";              # Prints `#` and the value of `$&`.

и

print "$replace[$i]";     # Prints the value of `$replace[$i]`.

. Вы можете использовать следующее:

use String::Substitution qw( gsub_modify );

for my $i (0..$#search) {
   gsub_modify($data, $search[$i], $replace[$i]);
}

Это более подробное объяснение.

s/$search[$i]/#$&/g

- это сокращение от

s/$search[$i]/  "#$&"   /eg

, что эквивалентно

s/$search[$i]/  "#" . $&   /eg    # Replaces with `#` and the value of `$&`.

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

С другой стороны,

s/$search[$i]/$replace[$i]/g

- это сокращение от

s/$search[$i]/  "$replace[$i]"   /eg

, что эквивалентно

s/$search[$i]/  $replace[$i]   /eg    # Replaces with the value of `$replace[$i]`.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...