编译正则表达式函数时出错,为什么会出现此问题?

Hom*_*an 5 regex raku

我的 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)

编译结果: 编译错误!此处不能使用占位符变量“@_”,因为周围的块没有签名。

我是否缺少一些明显的东西?任何帮助表示赞赏。

Mas*_*ssa 3

因此,与 @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,通过替换子字符串的任何外观来修改foobar上不会改变任何内容@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范围)