可能我做的事情完全错了,但有没有办法修改和组合 regexes 使用子程序?下面的程序不会编译 .
regexes
sub a(Regex $r1) { return rx/ <$r1> a / } my regex letter_b { b }; my $new = a(letter_b); say $new;
查看Regex的文档,它说:
可以使用正则表达式声明符定义命名的正则表达式,后跟花括号中的定义 . 由于任何正则表达式都可以进行Callable内省,因此需要通过&-sigil进行引用 . 我的正则表达式R {\ N};说&r . ^姓名; #OUTPUT:«Regex»
此外,Grammar文档(对于概念,而不是类型),它解释了更多关于此:
语法的主要成分是名为正则表达式 . 虽然Perl 6 Regexes的语法超出了本文档的范围,但是名为regexes的语法特殊,类似于子例程定义:my regex number {\ d [\ . \ d]? }在这种情况下,我们必须使用my关键字指定正则表达式的词法范围,因为命名的正则表达式通常在语法中使用 . 被命名给我们的优势是能够在其他地方轻松地重用正则表达式:比如说“32.51”~~&number; #OUTPUT:«True»这么说“15 4.5”~~ / <number> \ s *''\ s * <number> /#OUTPUT:«True»
因此,要将您的命名正则表达式作为参数传递到 a 子例程中,您所要做的就是在其前面加上&符号:
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»
要将函数称为第一个类值,请在其前面加上 & .
&
另外,不需要写 <$r1> ,因为P6已经知道 $r1 是正则表达式 . 所以:
<$r1>
$r1
sub a(Regex $r1) { return rx/ $r1 a / } my regex letter_b { b }; my $new = a(&letter_b); say $new; # rx/ $r1 a / say 'ba' ~~ $new; # 「ba」
你没有显示你的错误,但......
a(letter_b) 调用 letter_b 来获取其值 . (然后 a 将被调用, letter_b 返回的值作为第一个参数传递给 a . )
a(letter_b)
letter_b
但 letter_b 是一个正则表达式,并且
say Regex ~~ Method; # True
并且所有方法至少需要一个调用arg:
say &letter_b.signature; # (Mu $: *%_)
但你用零参数调用它 . 产量:
Too few positionals passed; expected 1 argument but got 0
我猜这是你的错误信息 .
2 回答
查看Regex的文档,它说:
此外,Grammar文档(对于概念,而不是类型),它解释了更多关于此:
因此,要将您的命名正则表达式作为参数传递到
a
子例程中,您所要做的就是在其前面加上&符号:要将函数称为第一个类值,请在其前面加上
&
.另外,不需要写
<$r1>
,因为P6已经知道$r1
是正则表达式 . 所以:你没有显示你的错误,但......
a(letter_b)
调用letter_b
来获取其值 . (然后a
将被调用,letter_b
返回的值作为第一个参数传递给a
. )但
letter_b
是一个正则表达式,并且并且所有方法至少需要一个调用arg:
但你用零参数调用它 . 产量:
我猜这是你的错误信息 .