可能我做的事情完全错了,但有没有办法修改和组合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)
查看文档Regex,它说:
regex可以使用正则表达式声明符定义命名,然后使用花括号定义它.由于任何正则表达式都Callable需要内省,因此需要通过&-sigil进行引用.Run Code Online (Sandbox Code Playgroud)my regex R { \N }; say &R.^name; # OUTPUT: «Regex?»
此外,Grammar文档(对于概念,而不是类型),它解释了更多关于此:
语法的主要成分是名为regexes.虽然Perl 6 Regexes的语法超出了本文档的范围,但是名为 regexes的语法特殊,类似于子例程定义:
Run Code Online (Sandbox Code Playgroud)my regex number { \d+ [ \. \d+ ]? }在这种情况下,我们必须使用
my关键字指定正则表达式的词法范围,因为命名的正则表达式通常在语法中使用.被命名为我们提供了在其他地方轻松重用正则表达式的优势:
Run Code Online (Sandbox Code Playgroud)say so "32.51" ~~ &number; # OUTPUT: «True?» say so "15 + 4.5" ~~ / <number> \s* '+' \s* <number> / # OUTPUT: «True?»
因此,要将您的命名正则表达式作为参数传递到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)
| 归档时间: |
|
| 查看次数: |
173 次 |
| 最近记录: |