Perl 6: обратная косая черта в транслитерации (tr ///) - PullRequest
0 голосов
/ 26 октября 2018

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

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

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

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

Ответы [ 2 ]

0 голосов
/ 01 ноября 2018

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

0 голосов
/ 26 октября 2018

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

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

Выходы

....

Справка:

...