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

时间:2018-01-04 21:27:25

标签: regex perl6 raku

我使用rakudo和以下代码:

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

我认为输出将是:

foo

但是,我得到了:

「foo」

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

我在文档中找不到任何相关内容,我似乎无法摆脱这些引用。这里发生了什么?

编辑:正在执行

say "$0";

取而代之的是引号,以及

print $0;
print "$0";

也这样做。所以我猜捕获实际上并不是一个字符串,而在它周围加上双引号会把它变成一个字符串? (顺便说一下,$ 0.gist产生“foo”,而不是foo。)有人能指出我可以了解这个行为的文档部分吗?我来自Perl,并且彻底迷茫。

2 个答案:

答案 0 :(得分:15)

say子调用.gist方法。相比之下,print子调用.Str方法。还有一个put子(“使用终结符打印”),它调用.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的目标。

答案 1 :(得分:1)

capture会返回Match,会在您发现时将其字符串化为匹配的字符串。

Grouping and Capturing

  

未量化的捕获产生Match对象。

顺便说一句,您可以通过.WHAT查看变量的实际类型:

say $0.WHAT;
(Match)