我可以反省正则表达式的内插值吗?
Can I introspect a Regex's interpolated value?
在下面的代码中,Regex $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
的 callframe
来找到相同的信息变量。但这似乎是一个相当脆弱的 hack 来获取 Regex 显然已经知道的信息,至少在某种程度上是这样。)
Can I introspect a Regex's interpolated value?
不,因为它还没有 被 插值,就像在闭包中一样 { say $a }
我们也不认为 $a
被插值,而是说它已经关闭了。正则表达式中的变量编译成该变量的查找,每次计算正则表达式时都会进行查找。这可以通过更改正则表达式评估之间的变量值来确认:
my $var = "foo";
my $rx = rx/$var/;
say "foobar" ~~ $rx; # 「foo」
$var = "bar";
say "foobar" ~~ $rx; # 「bar」
这里工作的更大原则是,在 Raku 中,正则表达式不是由标准库中的某些正则表达式实现处理的字符串,而是编译程序的一部分,并且与任何其他程序一样遵循相同的闭包语义阻止或重击。
他们 gist
到他们的源代码主要是出于实用的原因(Test
模块中更好的诊断输出可能是驱动力),但是它是由源代码字符串精确完成的在编译时附加到 Regex
对象。到运行时,都是字节码,不涉及你看到的源字符串。
在下面的代码中,Regex $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
的 callframe
来找到相同的信息变量。但这似乎是一个相当脆弱的 hack 来获取 Regex 显然已经知道的信息,至少在某种程度上是这样。)
Can I introspect a Regex's interpolated value?
不,因为它还没有 被 插值,就像在闭包中一样 { say $a }
我们也不认为 $a
被插值,而是说它已经关闭了。正则表达式中的变量编译成该变量的查找,每次计算正则表达式时都会进行查找。这可以通过更改正则表达式评估之间的变量值来确认:
my $var = "foo";
my $rx = rx/$var/;
say "foobar" ~~ $rx; # 「foo」
$var = "bar";
say "foobar" ~~ $rx; # 「bar」
这里工作的更大原则是,在 Raku 中,正则表达式不是由标准库中的某些正则表达式实现处理的字符串,而是编译程序的一部分,并且与任何其他程序一样遵循相同的闭包语义阻止或重击。
他们 gist
到他们的源代码主要是出于实用的原因(Test
模块中更好的诊断输出可能是驱动力),但是它是由源代码字符串精确完成的在编译时附加到 Regex
对象。到运行时,都是字节码,不涉及你看到的源字符串。