如何扁平化或字符串化对象(尤其是匹配)?

How to flatten or stringify an object (esp. Match)?

我们如何将 Match(或其他)对象扁平化或字符串化为字符串数据类型(尤其是大量的,即作为数组元素)?例如

'foobar' ~~ m{ (foo) };
say [=10=].WHAT;

my $foo = [=10=];
say $foo.WHAT
(Match)
(Match)

如何结束(Str)

Str takes any Cool value as argument, including a regex Match 对象的构造函数。

'foobar' ~~ m{ (foo) };
say [=10=].WHAT; # (Match)
say [=10=].Str.WHAT; # (Str)

只需将对象视为字符串即可。

如果您对 value/object 应用字符串操作,Raku 几乎总是会自动将其强制转换为字符串。

字符串操作包括printput等函数,中缀eq~连接等运算符,.starts-with.chop、插值,例如“包含 $variable 的字符串”,以及专用的强制转换程序,例如 .StrStr(...).

一个Match对象包含一个整体匹配。任何“子项”(sub-matches) 都只是对整个匹配项的子字符串的捕获。所以没有必要压平任何东西,因为你可以只处理单个整体匹配。

Match 个对象的列表是一个列表。列表本身就是一个对象。如果将字符串操作应用于列表,则会得到列表的元素,每个元素之间用 space 进行字符串化。

所以:

'foobar' ~~ m{ (f) (o) (o) };
put $/;          # foo
put $/ eq 'foo'; # True
put $/ ~ 'bar';  # foobar
put $/ .chop;    # fo
put "[$/]";      # [foo]
put $/ .Str;     # foo

my Str() $foo = $/;
say $foo.WHAT;   # (Str)

put 'foofoo' ~~ m:g{ (f) (o) (o) }; # foo foo

~ is the Str contextualizer:

'foobar' ~~ m{ (foo) };
say ~[=10=]

将直接强制转换为 Str。如果你有很多比赛,你可以使用它,我。即:

'foobar' ~~ m{ (f)(o)(o) };
say $/.map: ~*; # (f o o)