Как я могу найти и заменить текст, который выглядит как переменные Perl? - PullRequest
1 голос
/ 18 марта 2010

Меня действительно пинают здесь. Я не могу понять, как написать поиск и заменить, что будет правильно найти эту строку.

Строка:

$QData{"OrigFrom"} $Text{"wrote"}:

Примечание: это фактическая строка. Это НЕ переменные. Я не писал это.

Мне нужно заменить эту строку ни на что. Я пытался избежать $, {, и}. Я перепробовал все виды комбинаций, но это просто не получается правильно.

Кто-то испытывает желание нанести удар?

Спасибо!

Ответы [ 3 ]

4 голосов
/ 18 марта 2010

Никто не любит quotemeta ? Пусть Perl разберется с этим, чтобы вы не напрягали глаза со всеми этими обратными слешами. :)

 my $string = 'abc $QData{"OrigFrom"} $Text{"wrote"}: def';
 my $escaped = quotemeta '$QData{"OrigFrom"} $Text{"wrote"}:';

 $string =~ s/$escaped/Ponies!/;

 print $string;
3 голосов
/ 18 марта 2010

Первоначально я думал, что завершение вашего регулярного выражения в \Q / \E (начальный и конечный escape-символы) - это все, что вам нужно было сделать, но оказывается, что $@) не разрешено внутри \Q...\E последовательностей (см. http://search.cpan.org/perldoc/perlre#Escape_sequences).

Итак, вам нужно экранировать символы $ отдельно, но все остальное можно заключить в \Q ... \E:

/\$\QQData{"OrigFrom"} \E\$\QText{"wrote"}:\E/
1 голос
/ 18 марта 2010

регулярное выражение с использованием escape-символа \ будет

s/\$QData\{"OrigFrom"\} \$Text\{"wrote"\}://;

полный код теста:

#!/sw/bin/perl     

$_='$QData{"OrigFrom"} $Text{"wrote"}:';

s/\$QData\{"OrigFrom"\} \$Text\{"wrote"\}://;

print $_."\n";

ничего не выводит, кроме новой строки.

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