查找用于perl脚本的C API
试图理解perl脚本背后的C代码。例如,以下人为代码:查找用于perl脚本的C API,perl,Perl,试图理解perl脚本背后的C代码。例如,以下人为代码: $name = "john"; $greeting = "hi $name, how old are you?"; if ($greeting =~ /hi (\S+)/) { $b = $1; print "got $b as expected\n"; } 想知道变量$name在$greeting字符串中是如何被替换的,还想知道正则表达式匹配使用的是什么c API 我听过类似于perl-MO=Bytecode,-H te
$name = "john";
$greeting = "hi $name, how old are you?";
if ($greeting =~ /hi (\S+)/) {
$b = $1;
print "got $b as expected\n";
}
想知道变量$name在$greeting字符串中是如何被替换的,还想知道正则表达式匹配使用的是什么c API
我听过类似于
perl-MO=Bytecode,-H test.pl
的内容,其中test.pl包含上述内容,但输出是bindary Perl代码没有直接映射到C代码。相反,Perl是一个字节码编译器。你能得到的是字节码,操作码树。有几个模块可以以人类可读的形式实现这一点,一个是
生产这个
w <@> leave[1 ref] vKP/REFC ->(end)
1 <0> enter ->2
2 <;> nextstate(main 1 test.plx:1) v:{ ->3
5 <2> sassign vKS/2 ->6
3 <$> const[PV "john"] s ->4
- <1> ex-rv2sv sKRM*/1 ->5
4 <#> gvsv[*name] s ->5
6 <;> nextstate(main 1 test.plx:2) v:{ ->7
d <2> sassign vKS/2 ->e
- <1> ex-stringify sK/1 ->c
- <0> ex-pushmark s ->7
b <2> concat[t5] sKS/2 ->c
9 <2> concat[t4] sK/2 ->a
7 <$> const[PV "hi "] s ->8
- <1> ex-rv2sv sK/1 ->9
8 <#> gvsv[*name] s ->9
a <$> const[PV ", how old are you?"] s ->b
- <1> ex-rv2sv sKRM*/1 ->d
c <#> gvsv[*greeting] s ->d
w离开[1参考]vKP/REFC->(结束)
1输入->2
下一个状态(主测试1.plx:1)v:{->3
5.设计vKS/2->6
3常数[PV“john”]s->4
-ex-rv2sv sKRM*/1->5
4 gvsv[*名称]s->5
6下一状态(主1测试plx:2)v:{->7
d设计vKS/2->e
-简化sK/1->c
-ex pushmark s->7
b混凝土[t5]sKS/2->c
9混凝土[t4]sK/2->a
7常数[PV“hi”]s->8
-ex-rv2sv sK/1->9
8 gvsv[*name]s->9
a常量[PV],你多大了?]s->b
-ex-rv2sv sKRM*/1->d
c gvsv[*问候语]s->d
简明版的文档解释了所有这些。它告诉您操作符序列、类型、名称、标志以及序列中的下一个操作。例如
7 <$> const[PV "hi "] s ->8
7常数[PV“hi”]s->8
这是运算符7,它是一个SVOP(适用于标量),它的名称是“const”,代表标量字符串(PV)“hi”,它位于标量上下文中,下一个运算符是8
有关运算符的更多信息可以从和中学习。每个运算符都有一个与之关联的C函数,称为pp_OPNAME
,因此要查找“const”运算符,请查找pp_const
Perl正则表达式引擎是完全定制的,并且有自己的文档
7 <$> const[PV "hi "] s ->8