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

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

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

Я думал, что выход будет:

foo

Однако я получаю:

「foo」

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

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

Изменить: Выполнение

say "$0";

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

print $0;
print "$0";

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

Ответ 1

Подменю say вызывает метод .gist. Напротив, подканал print вызывает метод .Str. Там также put sub ( "print using terminator" ), который вызывает .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.

Ответ 2

Захват возвращает совпадение, которое переводится в строку совпадения, как вы обнаружили.

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

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

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

say $0.WHAT;
(Match)