我使用rakudo和以下代码:
"foo" ~~ m/(foo)/;
say $0;
我认为输出将是:
foo
但是,我得到了:
「foo」
(那个foo周围有一些奇怪的unicode-y引号。)
我在文档中找不到任何相关内容,我似乎无法摆脱这些引用。这里发生了什么?
编辑:正在执行
say "$0";
取而代之的是引号,以及
print $0;
print "$0";
也这样做。所以我猜捕获实际上并不是一个字符串,而在它周围加上双引号会把它变成一个字符串? (顺便说一下,$ 0.gist产生“foo”,而不是foo。)有人能指出我可以了解这个行为的文档部分吗?我来自Perl,并且彻底迷茫。
答案 0 :(得分:15)
say
子调用.gist
方法。相比之下,print
子调用.Str
方法。还有一个put
子(“使用终结符打印”),它调用.Str
然后执行换行。这可能是您想要使用的而不是say
。
.gist
和.Str
方法是将对象转换为Str
的两种不同方法。 .gist
方法提供了一种人性化的数据表示,用于表示其结构。如果你.gist
复杂Match
一堆捕获,它将显示那些(并使用缩进来显示匹配树)。相比之下,.Str
并不试图重现结构;在Match
对象上,它只提供Match
涵盖的文字。
因此,总结一下您遇到的Perl 5和Perl 6语言之间的差异:
Match
个对象,而不是字符串(这就是为什么语法可以生成解析树)say
函数调用.gist
put
函数大致相当于Perl 5中的say
函数最后,选择方形引号因为它们相对较少,因此不太可能存在于任何用户数据中,因此允许呈现捕获的数据,其中不太可能需要任何转义序列。这提供了一个更易于阅读的Match
概述,这是.gist
的目标。
答案 1 :(得分:1)