概要05提到Perl 6不会将变量插入到正则表达式中,但您可以将外部变量与模式相关联.据我所知,文档没有提到这个功能.我认为人们仍然希望以某种方式从字符串中建立一个模式,所以我很好奇这是如何工作的.
这是一个演示现在发生的事情的程序.我不知道这是应该发生的事情还是任何人的意图.我将变量插入到模式中.如果你用.perl查看$r,你会看到变量名.然后,我应用模式并匹配.我改变了变量的值.现在模式不匹配.将其更改为可行的其他内容,并再次匹配:
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: ',change back $n. The same $r does match. $n = 'ab'; put 'rx// directly: ',$target ~~ $r ?? "Matched $0" !! 'Misssed';
如果这是它应该做的,那很好.这里的文档很简单,测试(事实上的规范)对于像这样的远程行为并不复杂.
我可以做一些额外的工作来关闭副本(也许比我显示的更多的工作取决于$n中的内容),我觉得不合适:
my $r = do { my $m = $n; rx/ <$m> /; };
但是,我仍然希望有一种方法来“敲定”一个模式(哦,天哪,我只是要求/ o回来).也许是Regex中的一种方法.我想人们会寻找这个功能.
my $r = rx/ .... /.finalize; # I wish!
或者,Perl 6有更好的方法来做这种事情,我只是充满了旧学校的想法. Perl 6有规则而不是正则表达式.这背后实际上有一个解析器.我认为定义一个标记或规则可能是要走的路,但我想我遇到了同样的问题.我没有看到什么有一个subrule工厂.
还有其他方法可以做到这一点吗?