Вопрос:

Почему кавычки юникода появляются вокруг захвата регулярных выражений в perl6?

regex perl6 raku

191 просмотра

2 ответа

58 Репутация автора

Я использую rakudo, и следующий код:

"foo" ~~ m/(foo)/;
say $0;

Я думал, что результат будет:

foo

Тем не менее, я получаю:

「foo」

(Это foo с некоторыми странными юникод-кавычками вокруг него.)

Я не могу найти ничего об этом в документации, и я не могу избавиться от этих цитат. Что тут происходит?

Редактировать: Делать

say "$0";

вместо этого избавляется от кавычек, и оба

print $0;
print "$0";

делай тоже. Итак, я думаю, что на самом деле захват не является строкой, и двойные кавычки вокруг него каким-то образом превращают его в строку? (Кстати, $ 0.gist создает «foo», а не foo.) Может кто-нибудь указать мне на ту часть документации, где я могу узнать об этом поведении? Я пришел из Perl, и полностью растерялся.

Автор: Betta George Источник Размещён: 04.01.2018 09:27

Ответы (2)


1 плюс

2359 Репутация автора

Захват возвращает матч , который stringifies к совпавшей строке , как вы обнаружили.

Группировка и захват говорит

Неопределенный захват создает объект Match.

Кстати, вы можете увидеть, какого типа переменная на самом деле содержит .WHAT:

say $0.WHAT;
(Match)
Автор: Curt Tilmes Размещён: 04.01.2018 11:37

15 плюса

12299 Репутация автора

Решение

sayЮгу вызывает .gistметод. В отличие от этого, printподпрограмма вызывает .Strметод. Также есть putподпрограмма («печать с использованием терминатора»), которая вызывает, .Strа затем выполняет новую строку. Это, вероятно, то, что вы хотите использовать вместо say.

.gistИ .Strметоды два различных способа превратить объект в Str. .gistМетод обеспечивает удобные для запоминания представления данных , которое передает его структуру. Если у вас .gistсложный комплекс Matchс кучей снимков, он покажет их (и использует отступ для отображения дерева совпадений). Напротив, .Strне пытается воспроизвести структуру; на Matchобъекте, он просто дает текст, который Matchпокрывает.

Итак, суммируем различия между языками Perl 5 и Perl 6, с которыми вы сталкиваетесь:

  • Захваты - это Matchобъекты, а не строки (поэтому грамматика может создавать дерево разбора)
  • sayФункция в Perl 6 вызовов.gist
  • putФункция в Perl 6 в основном эквивалентна sayфункции в Perl 5

Наконец, квадратные кавычки были выбраны потому, что они относительно редки и, следовательно, вряд ли будут присутствовать в каких-либо пользовательских данных, и, следовательно, допускают представление захваченных данных, которые вряд ли нуждаются в каких-либо escape-последовательностях. Это обеспечивает более читаемый обзор рассматриваемого Matchвопроса, целью которого является .gist.

Автор: Jonathan Worthington Размещён: 05.01.2018 12:14
32x32