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

Bet*_*rge 11 regex perl6 raku

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

"foo" ~~ m/(foo)/;
say $0;
Run Code Online (Sandbox Code Playgroud)

我认为输出将是:

foo
Run Code Online (Sandbox Code Playgroud)

但是,我得到:

?foo?
Run Code Online (Sandbox Code Playgroud)

(这是foo,周围有一些奇怪的unicode-y引号.)

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

编辑:做

say "$0";
Run Code Online (Sandbox Code Playgroud)

而是摆脱了引号,两者兼而有之

print $0;
print "$0";
Run Code Online (Sandbox Code Playgroud)

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

Jon*_*ton 15

say次调用的.gist方法.相比之下,printsub调用该.Str方法.还有一个put子("使用终结符打印"),它调用.Str然后执行换行.那可能就是你想用的而不是say.

.gist.Str方法有两种不同的方式把对象插入Str.该.gist方法提供了传达其结构的数据的人类友好表示.如果你.gistMatch一堆复杂的捕获,它会显示那些(并使用缩进来显示匹配树).相比之下,.Str不试图重现结构; 在一个Match对象上,它只是给出了Match封面的文本.

因此,总结一下您遇到的Perl 5和Perl 6语言之间的差异:

  • 捕获是Match对象,而不是字符串(这就是语法可以生成解析树的原因)
  • sayPerl 6中的函数调用.gist
  • put在Perl 6功能主要是相当于say在Perl 5功能

最后,选择方形引号是因为它们相对较少,因此不太可能存在于任何用户数据中,因此允许呈现捕获的数据,其中不太可能需要任何转义序列.这提供了更容易阅读的Match问题概述,这是目的.gist.