perl6如何在用户定义的字符类中插入变量?

lis*_*tor 4 variables perl6 user-defined character-class raku

我正在尝试做的是允许程序根据遇到的文本来定义字符类。但是,<[]>从字面上接受字符,并且以下产生错误:

my $all1Line = slurp "htmlFile";
my @a = ($all1Line ~~ m:g/ (\" || \') ~ $0 {} :my $marker = $0; http <-[ $marker ]>*? page <-[ $marker ]>*? /); # error: $marker is taken literally as $ m a r k e r
Run Code Online (Sandbox Code Playgroud)

我想匹配所有格式为“ https:// foo?page = 0?ssl = 1 ”或“ http ... page ...”的链接

非常感谢你!

use*_*601 5

根据您的示例代码和文本,我不能完全确定您的源数据看起来像什么,因此无法提供更多详细信息。就是说,基于如何匹配匹配过程中较早部分的字符,最简单的方法是使用数组匹配:

my $input = "(abc)aaaaaa(def)ddee(ghi)gihgih(jkl)mnmnoo";

my @output = $input ~~ m:g/
    :my @valid;                # initialize variable in regex scope
    '(' ~ ')'  $<valid>=(.*?)  # capture initial text
    { @valid = $<valid>.comb } # split the text into characters
    $<text>=(@valid+)          # capture text, so long as it contains the characters
/;

say @output;
.say for @output.map(*<text>.Str);
Run Code Online (Sandbox Code Playgroud)

其输出是

[?(abc)aaaaaa?
 valid => ?abc?
 text => ?aaaaaa? ?(def)ddee?
 valid => ?def?
 text => ?ddee? ?(ghi)gihgih?
 valid => ?ghi?
 text => ?gihgih?]
aaaaaa
ddee
gihgih
Run Code Online (Sandbox Code Playgroud)

或者,您可以将整个字符类定义存储在一个变量中,并将变量引用为<$marker-char-class>,或者,如果要避免这种情况,可以将其全部内联定义为用解释为regex的代码<{ '<[' ~ $marker ~ ']>' }>。请注意,这两种方法都遇到相同的问题:您正在使用正则表达式语法构造字符类,这可能需要转义字符或特殊顺序,因此绝对不是最佳选择。

如果您经常执行此操作而不是非常随意,则还可以定义自己的regex方法标记,但这可能会过大,并且可以更好地用作其自身的问题。