如何停止在编译器阶段运行代码?

埃文·卡洛尔

这个问题需要对编译器阶段和BEGIN的理解Perl编程:第3版-第467页

了解编译阶段与编译时间之间以及运行阶段与运行时间之间的区别也很重要。典型的Perl程序会进入一个编译阶段,然后进入一个运行阶段。“阶段”是一个大规模的概念。但是编译时间和运行时间是小规模的概念。给定的编译阶段主要执行编译时工作,但是它也通过BEGIN执行一些运行时工作给定的运行阶段主要执行运行时工作,但是它可以通过诸如的运算符来执行编译时工作eval STRING

让我们举一个简单的例子

sub complex_sub {
  die 'code run';
}
sleep 5;
print 'good';
use constant FOO => complex_sub();

如果上述内容按原样运行,complex_sub则从用户角度来看,将在编译器阶段运行。但是,只要稍加修改,我就可以拥有。

# Bar.pm
package Bar {
  use constant FOO => main::complex_sub();
}

# test.pl
package main {
  sub complex_sub {
    die 'code run';
  }
  sleep 5;
  print 'good';
  require Bar;
}

在上面的代码complex_sub中,在执行阶段运行。无论如何,从complex_sub启用顶部语法的角度来区分这两种情况,但禁止底部语法。

疾病

使用${^GLOBAL_PHASE}变量。在第一种情况下,它包含“ START”,在第二种情况下,它包含“ RUN”。

# RUN
perl -wE'say ${^GLOBAL_PHASE}'

# START
perl -wE'BEGIN {say ${^GLOBAL_PHASE}}'

# RUN
perl -wE'eval q{BEGIN {say ${^GLOBAL_PHASE}}}'

有关详细信息,请参见perlvar

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

此代码如何在编译器中执行?

代码::块,如何将链接器选项`-lstdc ++`放在编译器命令的末尾?

如何从源代码构建和运行寓言编译器?

如何在我的编译器中运行Java代码

编译器中间阶段的代码优化的目的是什么?

如何编译一个编译器阶段的输出?

如何强制编译器在编译时评估开关?

编译器如何优化这段代码

如何在特定警告代码上停止Delphi编译器?

Java编译器:停止抱怨死代码

在编译器镜像中找不到对象Scala-以编程方式运行Scala编译器

如何运行一个文件源代码的Java程序时,通过编译器选项?

在编译器或类型检查器(javac)中导致堆栈溢出的Java代码段?

在未预先声明函数的情况下,GCC在编译器阶段不会引发错误

在编译器中注册分配

使用编译器运行代码后出现段错误

如何使用jack编译器为Android编译代码?

冗余代码是在编译器中管理还是每次都执行?

为什么它在编译器上出错但在 Spark-shell 上运行?

为什么在编写编译器时需要运行时库?

如何使Typescript编译器打印正在编译的文件名列表?

kapt生成的代码在编译阶段不可用

如何在编译器中包含汇编器

Delphi 10.3.1编译器生成的代码在编译为64位时会发出异常

Xcode在编译器开始编译时显示错误

检查编译器在编译时是否每晚

在编译时运行Nim代码

在编译时运行任意代码

如何编写(测试)编译器/ JIT无法优化的代码?