如何将变量插入到Perl 6正则表达式中?

bri*_*foy 8 regex rules perl6

概要05提到Perl 6不会将变量插入到正则表达式中,但您可以将外部变量与模式相关联.据我所知,文档没有提到这个功能.我认为人们仍然希望以某种方式从字符串中建立一个模式,所以我很好奇这是如何工作的.

这是一个演示现在发生的事情的程序.我不知道这是应该发生的事情还是任何人的意图.我将一个变量插入一个模式.如果你看一下$r.perl,你看变量名.然后,我应用模式并匹配.我改变了变量的值.现在模式不匹配.将其更改为可行的其他内容,并再次匹配:

my $target = 'abcdef';

my $n = 'abc';
my $r = rx/ ( <$n> ) /;

# the smart match like this doesn't return a Match object
# https://rt.perl.org/Ticket/Display.html?id=126969
put 'rx// directly: ',
    $target ~~ $r
        ?? "Matched $0" !! 'Misssed';

# now, change $n. The same $r won't match.
$n = 'xyz';

put 'rx// directly: ',
    $target ~~ $r
        ?? "Matched $0" !! 'Misssed';

# now, change back $n. The same $r does match.
$n = 'ab';
put 'rx// directly: ',
    $target ~~ $r
        ?? "Matched $0" !! 'Misssed';
Run Code Online (Sandbox Code Playgroud)

如果这是它应该做的,那很好.这里的文档很简单,测试(事实上的规范)对于像这样的远程行为并不复杂.

我可以做额外的工作来关闭副本(也许比我显示的工作更多,取决于里面的东西$n),我觉得不合适:

my $r = do {
    my $m = $n;
    rx/ <$m> /;
    };
Run Code Online (Sandbox Code Playgroud)

但是,我仍然希望有一种方法来"敲定"一个模式(哦,天哪,我只是要求/o回来).Regex也许是一种方法.我想人们会寻找这个功能.

my $r = rx/ .... /.finalize;  # I wish!
Run Code Online (Sandbox Code Playgroud)

或者,Perl 6有一个更好的方法来做这种事情,我只是充满了旧学校的想法.Perl 6有规则而不是正则表达式.实际上这背后有一个解析器.我想要定义一个token或者rule可能是要走的路,但我想我遇到了同样的问题.我没有看到什么有一个subrule工厂.

还有其他方法可以做到这一点吗?

Chr*_*oph 6

作为使用闭包的替代方法,您当然可以构建正则表达式EVAL.

除了这两个可以说是微不足道的解决方案之外,我也画了一个空白.请注意,您可以通过<{...}>语法执行更复杂的插值,例如

/ <{ BEGIN compute-string-once-at-compile-time }> /
Run Code Online (Sandbox Code Playgroud)

但我不知道如何用它来解决问题......

  • 它应该适用于当前的Rakudo,参见`sub foo {"foo"}; 我的$ r =/<{foo}> /; 说"foo"~~/<$ r> /;` - 然而,你仍然需要找出一种方法来附加数据,这看起来像是一个正交问题给我... (2认同)