Как я могу заменить совпадения регулярных выражений и отобразить замены в Perl?

I.e.:

echo H#97llo | MagicPerlCommand

Стандартный вывод:

Hallo

были MagicPerlCommand что-то вроде

perl -pnle "s/#(\d+)/chr(\1)/ge"

(но это не работает).


person secr    schedule 07.01.2009    source источник


Ответы (2)


Измените \1 на $1 в MagicPerlCommand. Стиль обратной ссылки \digit не работает, когда вычисляется выражение замены (например, s///e).

Это работало для меня в Windows и Linux.

person j_random_hacker    schedule 07.01.2009

Согласно ответу j_random_hacker, вы должны использовать $1, а не \1.

Это связано с тем, что использование модификатора '/e' в регулярном выражении означает, что правая половина является просто еще одним обычным выражением Perl, а не заменой регулярного выражения. Поскольку это Perl, вы должны использовать синтаксис Perl для ссылки на скобки, а не обычный синтаксис регулярных выражений.

person Alnitak    schedule 07.01.2009
comment
Да, это имеет смысл. Но странно, что echo H#97llo | perl -pnle s/#(\d+)/chr(\1)/ge действительно что-то вернул (и это не было исключением). - person secr; 07.01.2009
comment
на моих машинах (Linux FC10 и Mac OS X) ваш код выдает в печати широкий символ предупреждения. Он обрабатывает \1 как ссылку на скаляр. - person Alnitak; 07.01.2009
comment
Обратите внимание, что такое же предупреждение выдается и в Windows, что делает мой восхитительный комментарий глупым. - person secr; 07.01.2009