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
, \'
и т.д. В противном случае он остается как буквальный \
.
Ответ 2
У меня нет объяснения наблюдаемой проблеме. Однако, когда вы используете метод Perl 6 Str.trans
он выглядит так, как он работает:
say 'v^/\\'.trans( "\\^/v" => "." );
Выходы:
....
Ссылка: