为什么 unicode 引号出现在 perl6 中的正则表达式捕获周围?

Why do unicode quotes appear around a regex capture in perl6?

我正在使用 rakudo,以及以下代码:

"foo" ~~ m/(foo)/;
say [=10=];

我认为输出是:

foo

但是,我得到:

「foo」

(那是 foo 周围有一些奇怪的 unicode-y 引号。)

我在文档中找不到任何关于此的内容,而且我似乎无法删除这些引号。这里发生了什么?

编辑:做

say "[=13=]";

而是去掉引号,

print [=14=];
print "[=14=]";

也这样做。所以我猜捕获实际上不是一个字符串,并且在它周围加上双引号以某种方式将它变成一个字符串? (顺便说一句,$0.gist 产生“foo”,而不是 foo。)任何人都可以指出我可以了解此行为的文档部分吗?我来自 Perl,并且非常困惑。

一个 capture returns a Match 字符串化为您发现的匹配字符串。

Grouping and Capturing

An unquantified capture produces a Match object.

顺便说一句,你可以看到变量实际持有的类型 .WHAT:

say [=10=].WHAT;
(Match)

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 对象,而不是字符串(这就是语法可以生成解析树的原因)
  • Perl 6 中的 say 函数调用 .gist
  • Perl 6 中的 put 函数大部分等同于 Perl 5 中的 say 函数

最后,选择方引号是因为它们相对罕见,因此不太可能出现在任何用户数据中,因此可以显示捕获的数据,而这些数据中不太可能需要任何转义序列。这提供了有关 Match 的更易于阅读的概述,这是 .gist.

的目标