Как обойти строку Perl, экранирующую строку замены в s ///? - PullRequest
3 голосов
/ 03 февраля 2011

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

Начиная с файла 'test.txt', содержащего следующее:

foo

После запуска следующей команды (в bash):

perl -n -e "s/(\w)oo/$1ar/; print;" test.txt

вывод 'far'

Однако, когда я ввожу переменную, содержащую строку замены,

perl -n -e '$bar = q($1ar); s/(\w)oo/$bar/; print;' test.txt

вывод: '$1ar'.

Что мне нужно изменить, чтобы вторая программа также выводила 'far' и какие ключевые слова мне нужно было бы узнать, чтобы сделать этот ответ Googleable?

Также я попытался изменить второй на s /// e, но безрезультатно.

Редактировать: Это был не тот вопрос, который я хотел задать, это здесь .

Ответы [ 3 ]

6 голосов
/ 03 февраля 2011

Это работает для меня (в bash; вам может потребоваться изменить ваши кавычки):

perl -n -e '$bar = "\${1} . ar"; s/(\w)oo/$bar/ee; print;' test.txt

ee заменяет заменяющую часть как текстовую строку. См. perlop (1) .

1 голос
/ 03 февраля 2011

/ ee от @maxelost правильно.

Это работает в Perl-программе
$bar = q("${1}ar");
$str = "foo";
$str =~ s/(\w)oo/$bar/ee;
print $str;

поэтому я предполагаю, что это работает в bash:

perl -e '$bar = q("${1}ar"); s/(\w)oo/$bar/ee; print;' test.txt

в окнах:

perl -e "$bar = q(\"${1}ar\"); s/(\w)oo/$bar/ee; print;" test.txt

1 голос
/ 03 февраля 2011

Я надеюсь, что кто-то придет с чем-то лучше, но у меня это работает:

perl -n -e '$bar=q($1."ar"); s/(\w)oo/eval($bar)/e; print;' test.txt

Я устанавливаю $ bar в выражение, которое объединяет $1 в 'ar', чтобы я мог оценить его в замещающей части (используя флаг e).

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