我可以内省正则表达式的插值吗?

问题描述

在下面的代码中,正则表达式 $r 清楚地“知道”它包含文本 bar – 这就是它能够与 Str bar 匹配的方式。但是 .gist.raku 报告 $r 包含变量 $foo 而没有说明 $foo 包含什么值。有没有办法让 $r 告诉我它的计算值?

sub f {
    my $foo = 'bar';
    g(rx/$foo/);
}

sub g($r) {
    say $r.gist;
    say 'bar' ~~ rx/$r/;
}

f # OUTPUT:  rx/$foo/
  #          「bar」

(我知道我可以通过手动解析$r,找到所有变量,然后遍历&g的{​​{1}}来查找变量的值来访问相同的信息。但这似乎是一个相当脆弱的技巧,可以获取正则表达式显然已经知道的信息,至少在某种程度上是这样。)

解决方法

我可以内省正则表达式的插值吗?

不,因为它没有被插入,就像在闭包 { say $a } 中我们也不认为 $a 被插入,而是说它关闭了。正则表达式中的变量编译为对该变量的查找,每次计算正则表达式时都会进行查找。这可以通过在正则表达式的评估之间更改变量的值来确认:

my $var = "foo";
my $rx = rx/$var/;
say "foobar" ~~ $rx;    # 「foo」
$var = "bar";
say "foobar" ~~ $rx;    # 「bar」

这里工作的更大原则是,在 Raku 中,正则表达式不是由标准库中的某些正则表达式实现处理的字符串,而是编译程序的一部分,并且与任何其他块或砰的一声。

他们 gist 到他们的来源主要是出于实用原因(Test 模块中更好的诊断输出可能是驱动力),但是它是通过附加的源代码字符串精确完成的在编译时到 Regex 对象。到运行时,都是字节码,不涉及你看到的源字符串。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...