BEGIN什么时候开始(或运行)?

jjm*_*elo 5 perl6 precompile

这与Perl 6文档仓库中的此问题有关

实际运行BEGIN 的阶段并不太清楚.文档说"编译时间",但Perl是预编译的,因此实际上可能编译时间.事实上,让我们使用这段代码

unit module Beginner;

BEGIN {
    say "This is where all started";
}
Run Code Online (Sandbox Code Playgroud)

从这里

require Beginner;

say "Begun";
Run Code Online (Sandbox Code Playgroud)

在一个新目录(rm -rf .precomp运行).它输出:

This is where all started
Begun
Run Code Online (Sandbox Code Playgroud)

到目前为止,.precomp已经创建了保存缓存的目录.

所以让我们从这里使用它:

use Beginner;
say "Already started";
Run Code Online (Sandbox Code Playgroud)

它显然只是回归Already started.(如果我们运行第一个程序也会发生同样的情况)这可能是一个问题,因为用户可能事先不知道是否可能发生预编译,这反过来意味着它不确定何时发生"编译时间".无论如何,问题是:我们如何正确地制定这个来在文档中解释它?此外,是否应该BEGIN鼓励使用(因为计算的值将存储在预编译缓存中,从而有效地从运行时中消除)或不鼓励?这有什么好的用例吗?

mor*_*itz 8

BEGIN 在编译时发生,正如您已正确观察到的,这可能是预编译时间.

我没有看到任何问题,只要你不假设编译发生在脚本启动时.就像在编译时评估C++模板一样,这通常与执行时间非常不同.

此外,是否应该鼓励使用BEGIN(因为计算的值将存储在预编译缓存中,从而有效地从运行时中消除)或不鼓励

应该鼓励一切适当的用例,并且对其他一切都不鼓励.

如果你想在程序启动时运行一些东西,请使用INIT,而不是BEGIN.

这有什么好的用例吗?

许多元编程可以(并且应该)在编译时完成,例如基于固定的名称列表创建方法和属性的列表.在每个程序启动时执行此操作将是一种浪费,并且程序的其他部分可能在编译时需要完整类型.