如何将正则表达式作为参数传递给Perl 6中的子例程

Eug*_*sky 4 perl6

可能我做的事情完全错了,但有没有办法修改和组合regexes使用子程序?下面的程序不会编译.

sub a(Regex $r1) {
  return rx/ <$r1> a /
}

my regex letter_b { b };

my $new = a(letter_b);
say $new;
Run Code Online (Sandbox Code Playgroud)

cal*_*ter 8

查看文档Regex,它说:

regex可以使用正则表达式声明符定义命名,然后使用花括号定义它.由于任何正则表达式都Callable需要内省,因此需要通过&-sigil进行引用.

my regex R { \N };
say &R.^name; # OUTPUT: «Regex?»
Run Code Online (Sandbox Code Playgroud)

此外,Grammar文档(对于概念,而不是类型),它解释了更多关于此:

语法的主要成分是名为regexes.虽然Perl 6 Regexes的语法超出了本文档的范围,但是名为 regexes的语法特殊,类似于子例程定义:

my regex number { \d+ [ \. \d+ ]? }
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我们必须使用my关键字指定正则表达式的词法范围,因为命名的正则表达式通常在语法中使用.

被命名为我们提供了在其他地方轻松重用正则表达式的优势:

say so "32.51" ~~ &number;                                    # OUTPUT: «True?»
say so "15 + 4.5" ~~ / <number> \s* '+' \s* <number> /        # OUTPUT: «True?»
Run Code Online (Sandbox Code Playgroud)

因此,要将您的命名正则表达式作为参数传递到a子例程中,您只需在其前面添加一个&符号:

my $new = a(&letter_b);
#           ^
#  This is what you need!

say $new;
say so "ba" ~~ $new;         # OUTPUT: «True?»
say so "ca" ~~ $new;         # OUTPUT: «False?»
Run Code Online (Sandbox Code Playgroud)