【发布时间】:2017-04-14 11:15:24
【问题描述】:
Synopsis 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';
如果这是它应该做的,那很好。这里的文档很简单,并且测试(de facto 规范)对于像这样的长期行为并不复杂。
我可以做额外的工作来关闭一个副本(根据$n 中的内容,我可能会做比我展示的更多的工作),我觉得这不太合适:
my $r = do {
my $m = $n;
rx/ <$m> /;
};
但是,我仍然希望有一种方法来“确定”一个模式(哦,天哪,我只是要求/o 回来)。可能是Regex 中的一个方法。我想人们会寻找这个功能。
my $r = rx/ .... /.finalize; # I wish!
或者,Perl 6 有更好的方法来做这种事情,而我只是充满了老派的想法。 Perl 6 有规则而不是正则表达式。这一切背后实际上有一个解析器。我认为定义token 或rule 可能是要走的路,但我想我遇到了同样的问题。我看不出有什么子规则工厂。
还有其他方法可以做到这一点吗?
【问题讨论】:
-
如果您将其分解为接受变量字段作为参数的子例程,“关闭副本”解决方案看起来并不笨拙。我在自己的一些 Perl 6 代码中使用了该解决方案。我认为目前没有更好的方法。
-
我知道这不是你要问的,但变量 do 实际上是在 Perl6 正则表达式中插入的,但它们被视为文字字符串,而不是子正则表达式。在您的示例中,您可以使用
rx/$n/或更好的rx/"$n"/并获得相同的结果。 (包括相同的匹配/遗漏行为。) -
您查看的维度有误。我想要变量的当前值,而不是后来的值。甚至你给出的例子都没有。
-
@briandfoy 你能解释一下,使用
rx/ ( <$n> ) /有什么意义,而不仅仅是rx/ $n /?