Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.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解释器是逐行还是全部解析代码?_Perl_Interpreter - Fatal编程技术网

perl解释器是逐行还是全部解析代码?

perl解释器是逐行还是全部解析代码?,perl,interpreter,Perl,Interpreter,根据我对perl解释器的理解,代码首先被解析为操作码。然后在执行期间解释此操作码图。我想知道解析是逐行进行还是全部一起进行 我有一些代码在开头有一个exit语句,但是当我运行脚本时,perl报告了一个位于exit语句下方的错误。(错误是缺少分号。)如果perl解释器逐行工作,它如何报告exit语句下面的错误?还是在解析阶段报告错误 如果perl解释器逐行工作,它如何报告exit语句下面的错误?还是在解析阶段报告错误 在解析/编译阶段报告了有问题的错误。即使您使用了-c,它也会被报告。这些被称为“

根据我对perl解释器的理解,代码首先被解析为操作码。然后在执行期间解释此操作码图。我想知道解析是逐行进行还是全部一起进行

我有一些代码在开头有一个
exit
语句,但是当我运行脚本时,perl报告了一个位于
exit
语句下方的错误。(错误是缺少分号。)如果perl解释器逐行工作,它如何报告exit语句下面的错误?还是在解析阶段报告错误

如果perl解释器逐行工作,它如何报告exit语句下面的错误?还是在解析阶段报告错误

在解析/编译阶段报告了有问题的错误。即使您使用了
-c
,它也会被报告。这些被称为“编译时错误”

在该阶段无法检测到某些错误。这些被称为“运行时错误”


根据我对perl解释器的理解,代码首先被解析为操作码。然后在执行期间解释此操作码图。我想知道解析是逐行进行还是全部一起进行

文件作为一个整体进行编译,然后从一开始就执行编译后的表单
BEGIN
use
语句与此不同;它们在编译后立即执行(即在编译文件的其余部分之前)

使用
-c
会导致Perl在开始执行之前退出。(
BEGIN
use
语句仍正常执行。)

以下是编译结果的相似之处:

$ perl -MO=Concise,-exec -e'
    my $x = 4;
    $x += 5;
    print "$x\n";
'
1  <0> enter
2  <;> nextstate(main 1 -e:2) v:{
3  <$> const[IV 4] s
4  <0> padsv[$x:1,2] sRM*/LVINTRO
5  <2> sassign vKS/2
6  <;> nextstate(main 2 -e:3) v:{
7  <0> padsv[$x:1,2] sRM
8  <$> const[IV 5] s
9  <2> add[t2] vKS/2
a  <;> nextstate(main 2 -e:4) v:{
b  <0> pushmark s
c  <0> padsv[$x:1,2] s
d  <$> const[PV "\n"] s
e  <2> concat[t3] sK/2
f  <@> print vK
g  <@> leave[1 ref] vKP/REFC
-e syntax OK
$perl-MO=简明,-exec-e'
我的$x=4;
$x+=5;
打印“$x\n”;
'
1进入
2下一状态(主1-e:2)v:{
3常数[IV 4]s
4 padsv[$x:1,2]sRM*/LVINTRO
5个设计vKS/2
6下一状态(主2-e:3)v:{
7 padsv[$x:1,2]sRM
8常数[IV 5]s
9添加[t2]vKS/2
a下一状态(主2-e:4)v:{
b图章s
c padsv[$x:1,2]s
d常数[PV“\n”]s
e concat[t3]sK/2
f打印vK
g离开[1参考]vKP/参考C
-e语法正常
如果perl解释器逐行工作,它如何报告exit语句下面的错误?或者在解析阶段报告错误

问题中的错误是在解析/编译阶段报告的。即使使用了
-c
,也会报告该错误。这些错误称为“编译时错误”

在该阶段无法检测到某些错误。这些错误称为“运行时错误”


根据我对perl解释器的理解,首先将代码解析为操作码。然后在执行过程中对该操作码图进行解释。我想知道是逐行解析还是全部解析

文件作为一个整体进行编译,然后从一开始就执行编译后的表单。
BEGIN
use
语句与此不同;它们在编译后立即执行(即在编译文件的其余部分之前)

使用
-c
会导致Perl在开始执行之前退出。(
BEGIN
use
语句仍然正常执行。)

以下是编译结果的相似之处:

$ perl -MO=Concise,-exec -e'
    my $x = 4;
    $x += 5;
    print "$x\n";
'
1  <0> enter
2  <;> nextstate(main 1 -e:2) v:{
3  <$> const[IV 4] s
4  <0> padsv[$x:1,2] sRM*/LVINTRO
5  <2> sassign vKS/2
6  <;> nextstate(main 2 -e:3) v:{
7  <0> padsv[$x:1,2] sRM
8  <$> const[IV 5] s
9  <2> add[t2] vKS/2
a  <;> nextstate(main 2 -e:4) v:{
b  <0> pushmark s
c  <0> padsv[$x:1,2] s
d  <$> const[PV "\n"] s
e  <2> concat[t3] sK/2
f  <@> print vK
g  <@> leave[1 ref] vKP/REFC
-e syntax OK
$perl-MO=简明,-exec-e'
我的$x=4;
$x+=5;
打印“$x\n”;
'
1进入
2下一状态(主1-e:2)v:{
3常数[IV 4]s
4 padsv[$x:1,2]sRM*/LVINTRO
5个设计vKS/2
6下一状态(主2-e:3)v:{
7 padsv[$x:1,2]sRM
8常数[IV 5]s
9添加[t2]vKS/2
a下一状态(主2-e:4)v:{
b图章s
c padsv[$x:1,2]s
d常数[PV“\n”]s
e concat[t3]sK/2
f打印vK
g离开[1参考]vKP/参考C
-e语法正常

Perl最大的优点是编译器和解释器协同工作。编译后的代码可以在编译过程中部分执行,解释器可以要求在运行时编译代码

一般来说,一个程序是逐字符编译然后执行的,但是如果编译器遇到
BEGIN
块(或者
use
语句,其工作方式类似于
BEGIN
),那么在编译程序的其余部分之前,会调用Perl解释器来执行该块

一旦编译器到达文件末尾,代码就由解释器执行。但是运行时Perl也可以使用
eval
调用编译器


如果主源文件中的任何地方出现致命错误,如缺少分号,那么Perl编译器将在解释器开始执行编译后的代码之前立即报告错误。Perl的优点在于编译器和解释器携手工作。编译后的代码可以通过c部分执行编译过程,解释器可以要求在运行时编译代码

一般来说,一个程序是逐字符编译然后执行的,但是如果编译器遇到
BEGIN
块(或者
use
语句,其工作方式类似于
BEGIN
),那么在编译程序的其余部分之前,会调用Perl解释器来执行该块

一旦编译器到达文件末尾,代码就由解释器执行。但是运行时Perl也可以使用
eval
调用编译器


如果主源文件中的任何地方出现致命错误,如缺少分号,那么在解释器开始执行编译后的代码之前,Perl编译器将立即报告错误

您在问一个关于非常低级的Perl的问题。为什么您需要知道这一点?阅读下面的答案后,比较
Perl-e'ex它;if'
to
perl-e'BEGIN{exit}if'
你在问一个关于非常低级的perl的问题。为什么你需要知道这个?在
$ perl -MO=Concise,-exec -e'
    my $x = 4;
    $x += 5;
    print "$x\n";
'
1  <0> enter
2  <;> nextstate(main 1 -e:2) v:{
3  <$> const[IV 4] s
4  <0> padsv[$x:1,2] sRM*/LVINTRO
5  <2> sassign vKS/2
6  <;> nextstate(main 2 -e:3) v:{
7  <0> padsv[$x:1,2] sRM
8  <$> const[IV 5] s
9  <2> add[t2] vKS/2
a  <;> nextstate(main 2 -e:4) v:{
b  <0> pushmark s
c  <0> padsv[$x:1,2] s
d  <$> const[PV "\n"] s
e  <2> concat[t3] sK/2
f  <@> print vK
g  <@> leave[1 ref] vKP/REFC
-e syntax OK