概要 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';
如果这是它应该做的,那很好。这里的文档很简单,并且测试(事实上的规范)对于像这样的远程行为并不复杂。
我可以做额外的工作来关闭副本(可能比我显示的工作更多,这取决于
$n
中的内容),我觉得这很糟糕:my $r = do {
my $m = $n;
rx/ <$m> /;
};
但是,我仍然希望有一种“最终确定”模式的方法(天哪,我只是要求
/o
回来)。 Regex
中的一个方法也许。我认为人们会寻找这个功能。my $r = rx/ .... /.finalize; # I wish!
或者,Perl 6 有更好的方法来做这种事情,而我只是满脑子都是老派的想法。 Perl 6 有规则而不是正则表达式。这一切背后实际上有一个解析器。我想定义一个
token
或 rule
可能是要走的路,但我想我遇到了同样的问题。我看不出有什么子规则工厂。我还有其他方法可以做到这一点吗?
最佳答案
作为使用闭包的替代方法,您当然可以通过 EVAL
构建正则表达式。 .
除了这两个可以说是次等的解决方案,我也画了一个空白。请注意,您可以通过 <{...}>
进行更复杂的插值。语法,例如
/ <{ BEGIN compute-string-once-at-compile-time }> /
但我不知道如何使用它来解决问题......
关于regex - 如何将变量插入 Perl 6 正则表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40883160/