Perl 6: обратная косая черта в транслитерации (tr///)

Я заметил, экспериментируя с tr///, что он, похоже, не переводит обратную косую черту, даже когда его экранируют. Например,

say TR"\^/v"." given 'v^/\\';
say TR"\\^/v"." given 'v^/\\';
say TR"\ ^/v"." given 'v^/\\';

Все они выводят ...\ а не то, что я ожидал, ....

Есть и другое странное поведение, например \ как бы экранирование только строчных букв, но страница документации не содержит много информации... Каково поведение обратной косой черты (\) при транслитерации (tr///)?

Ответы

Ответ 1

Существует ошибка, вызванная проглатыванием обратной косой черты вместо правильного экранирования вещей в грамматике для tr///.

say TR/\\// given '\\'
===SORRY!=== Error while compiling:
Malformed replacement part; couldn't find final /
at line 2
------> <BOL>⏏<EOL>

Я поднял https://github.com/rakudo/rakudo/issues/2456 и отправил https://github.com/rakudo/rakudo/pull/2457, в котором это исправлено.

Вторая часть ответа заключается в том, что в некоторых конструкциях кавычек Perl 6 очень старается интерпретировать \ только как escape для допустимых escape-последовательностей, т.е. \n, \r, \s, \' и т.д. В противном случае он остается как буквальный \.