我的 RAKU 代码:
sub comments {
if ($DEBUG) { say "<filtering comments>\n"; }
my @filteredtitles = ();
# This loops through each track
for @tracks -> $title {
##########################
# LAB 1 TASK 2 #
##########################
## Add regex substitutions to remove superflous comments and all that follows them
## Assign to $_ with smartmatcher (~~)
##########################
$_ = $title;
if ($_) ~~ s:g:mrx/ .*<?[\(^.*]> / {
# Repeat for the other symbols
########################## End Task 2
# Add the edited $title to the new array of titles
@filteredtitles.push: $_;
}
}
# Updates @tracks
return @filteredtitles;
}
Run Code Online (Sandbox Code Playgroud)
编译结果: 编译错误!此处不能使用占位符变量“@_”,因为周围的块没有签名。
我是否缺少一些明显的东西?任何帮助表示赞赏。
因此,与 @raiph 的答案相反,我得到的是:
my @tracks = <Foo Ba(r B^az>.map: { S:g / <[\(^]> // };
Run Code Online (Sandbox Code Playgroud)
只是。没有其他的。让我们从内到外剖析一下:
这部分:/ <[\(^]> /是一个正则表达式,将匹配一个字符,只要它是左括号(用 表示)\(或脱字号(^)。当它们进入尖括号/方括号组合内时,意味着这是一个枚举字符类。
然后,:S引入非破坏性替换,即一个引用结构,它将对主题变量进行基于正则表达式的替换$_,但不会修改它,只是返回其值以及所请求的修改。在上面的代码中,S:g将副词:gor :global(请参阅文档副词部分中的全局副词)进行播放,意思是(在替换的情况下)“请尽可能多地进行此替换”,最后/标记替换文本的末尾,并且由于它与第二个相邻/,这意味着
S:g / <[\(^]> //
Run Code Online (Sandbox Code Playgroud)
表示“请返回 的内容$_,但以删除其与正则表达式匹配的所有字符的方式进行修改<[\(^]>(替换为空字符串)”
在这一点上,我应该强调 Raku 中的正则表达式确实非常强大,阅读整个页面(可能还有最佳实践和陷阱页面)是一个好主意。
接下来,此处记录的:.map方法将应用于任何(以及所有类似的元素) ,并将基于 的每个元素返回一个序列,该序列由传递给它的 a 更改。所以,像这样:IterableListArrayIterableCode
@x.map({ S:g / foo /bar/ })
Run Code Online (Sandbox Code Playgroud)
本质上意味着“请返回Seq上每个项目的影响@x,通过替换子字符串的任何外观来修改foo” bar(上不会改变任何内容@x)。这里是开始学习序列和迭代的好地方。
最后,我的一句台词
my @tracks = <Foo Ba(r B^az>.map: { S:g / <[\(^]> // };
Run Code Online (Sandbox Code Playgroud)
可以翻译为:
我有一个List包含三个字符串元素的
Foo
Ba(r
B^az
Run Code Online (Sandbox Code Playgroud)
(这将是您的“标题列表”的占位符)。获取该列表并生成第二个列表,其中包含其中的每个元素,但删除了字符“左括号”和“插入符号”的所有实例。
啊,并将结果存储在变量中@tracks(具有my范围)