Шестнадцатеричные переменные в шаблонах замещения - PullRequest
1 голос
/ 25 февраля 2011

Файл, который я получаю, заполнен плохо отформатированными кодами UTF-8, такими как <0308> и т. Д. Я могу правильно их идентифицировать, но я хочу заменить их на настоящую букву UTF-8, предпочтительно на регулярное выражение. Я пробовал десятки таких регулярных выражений:

s/<[0-9a-fA-F]{2,4}/\x{$1}/g
s/<[0-9a-fA-F]{2,4}/\N{U+$1}/g

И так далее, но каждый раз он говорит мне, что $ не является действительным шестнадцатеричным символом (с чем я полностью согласен). Разве это не должно просто взять число в моем $1 и вставить его туда? Или Perl действительно ожидает, что я буду использовать \x{..} или \N{U+..} только с фиксированными значениями? Если это так, я должен был бы написать вручную преобразование для каждого возможного шестнадцатеричного значения - не очень полезно.

Ответы [ 3 ]

3 голосов
/ 25 февраля 2011

Во-первых, вам нужно использовать скобки, чтобы захватить что-то в вашем регулярном выражении;в противном случае $1 не будет установлен на что-либо.

chr + hex с eval поможет вам в этом:

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

Какую версию perl вы используете?Кажется, это работает нормально для меня на 5.10.1:

$ perl -E '$foo = "<0308>"; $foo =~ s/<[0-9a-fA-F]{2,4}/\N{U+$1}/g; say $foo'
Wide character in print at -e line 1.
�>

\x{$1} кажется, что цифры заменяются ничем, но я все еще не получаю сообщение об ошибке.)

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

Вам, вероятно, нужно использовать переключатель eval к ​​нему. Попробуйте /\x{$1}/eg или /"\x{$1}"/eg

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