【问题标题】:How can I interpolate a variable into a Perl 6 regex?如何将变量插入 Perl 6 正则表达式?
【发布时间】: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 有规则而不是正则表达式。这一切背后实际上有一个解析器。我认为定义tokenrule 可能是要走的路,但我想我遇到了同样的问题。我看不出有什么子规则工厂。

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

【问题讨论】:

  • 如果您将其分解为接受变量字段作为参数的子例程,“关闭副本”解决方案看起来并不笨拙。我在自己的一些 Perl 6 代码中使用了该解决方案。我认为目前没有更好的方法。
  • 我知道这不是你要问的,但变量 do 实际上是在 Perl6 正则表达式中插入的,但它们被视为文字字符串,而不是子正则表达式。在您的示例中,您可以使用 rx/$n/ 或更好的 rx/"$n"/ 并获得相同的结果。 (包括相同的匹配/遗漏行为。)
  • 您查看的维度有误。我想要变量的当前值,而不是后来的值。甚至你给出的例子都没有。
  • @briandfoy 你能解释一下,使用rx/ ( &lt;$n&gt; ) / 有什么意义,而不仅仅是rx/ $n /

标签: regex rules raku


【解决方案1】:

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

除了这两个可以说是低于标准的解决方案之外,我还画了一个空白。请注意,您可以通过&lt;{...}&gt; 语法进行更复杂的插值,例如

/ <{ BEGIN compute-string-once-at-compile-time }> /

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

【讨论】:

  • 我确实看到你应该能够在 中调用一个函数,但我也注意到在测试中它注意到它还没有工作。
  • 它应该适用于当前的 Rakudo,参见 sub foo { "foo" }; my $r = /&lt;{foo}&gt;/; say "foo" ~~ /&lt;$r&gt;/; - 但是,您仍然需要找到一种附加数据的方法,这对我来说似乎是一个正交问题......
猜你喜欢
  • 1970-01-01
  • 2015-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多