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

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

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

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

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


person Jo King    schedule 26.10.2018    source источник
comment
Я не думаю, что какой-либо из аспектов пользовательской документации этой сути помогает, но, возможно, ссылки на жареные тесты и код в конце do   -  person raiph    schedule 26.10.2018
comment
Мне кажется, что это ошибка в недокументированной роли «cc» в QGrammar, которая используется оператором tr/// github.com/rakudo/rakudo/blob/master/src/Perl6/   -  person donaldh    schedule 30.10.2018


Ответы (2)


Существует ошибка, вызванная проглатыванием обратной косой черты вместо правильного экранирования вещей в грамматике для 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, \' и т. д. В противном случае он остается литералом \.

person donaldh    schedule 01.11.2018

У меня нет объяснения наблюдаемой проблеме. Однако, когда вы используете метод Perl 6 Str.trans, похоже, что он работает. как и ожидалось:

say 'v^/\\'.trans( "\\^/v" => "." );

Выводы:

....

Ссылка:

person wp78de    schedule 26.10.2018
comment
Я знаю о подпрограмме trans (я мог бы даже использовать s:g///, если бы хотел быть более регулярным), но мой вопрос конкретно касается поведения tr///. trans просто занимает Pairs, а строки и регулярные выражения заранее оцениваются обычным способом. - person Jo King; 27.10.2018