Я использую 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)