Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
查找用于perl脚本的C API_Perl - Fatal编程技术网

查找用于perl脚本的C API

查找用于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

试图理解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 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