Как я могу узнать, что было заменено в замене Perl? - PullRequest
0 голосов
/ 26 февраля 2010

Есть ли способ узнать, что было заменено ("старый" текст) после применения оператора s///? Я пытался сделать:

if (s/(\w+)/new/) {
    my $oldTxt = $1;
    # ...
}

Но это не работает. $1 не определено.

Ответы [ 5 ]

7 голосов
/ 26 февраля 2010

Ваш код работает на меня. Скопировано и вставлено из реального окна терминала:

$ perl -le '$_ = "*X*"; if (s/(\w+)/new/) { print $1 }'
X

Ваша проблема должна быть чем-то другим.

6 голосов
/ 26 февраля 2010

Если вы используете 5.10 или более позднюю версию, вам не нужно использовать потенциально-убийство $&. Переменная ${^MATCH} из флага /p делает то же самое, но только для указанного регулярного выражения:

 use 5.010;

 if( s/abc(\w+)123/new/p ) {
      say "I replaced ${^MATCH}"
      }
1 голос
/ 26 февраля 2010

$& делает то, что вы хотите, но видите предупреждение о работоспособности в perlvar

Использование этой переменной в любом месте программы налагает значительное снижение производительности на все регулярные выражениясовпадения.

Если вы можете найти способ сделать это без использования $&, попробуйте это.Вы можете запустить регулярное выражение дважды:

my ($match) = /(\w+)/;
if (s/(\w+)/new/) {
    my $oldTxt = $match;
    # ...
}
0 голосов
/ 26 февраля 2010

Вы можете сделать замену eval выражение:

if (s/(\w+)/$var=$1; "new"/e) { .. do something with $var .. }
0 голосов
/ 26 февраля 2010

Вы должны иметь возможность использовать переменные соответствия Perl:

$& Содержит строку, сопоставленную с последним совпадением шаблона

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