Perl 帕尔莫问题

Perl 帕尔莫问题,perl,perl-module,Perl,Perl Module,在中的示例中,有一个BEGIN块。我查看了一些模块,但没有一个模块有BEGIN块。在编写模块时,我应该使用这样的BEGIN块吗?还是说它是可有可无的?模块中的BEGIN块是完全可有可无的。只有在模块加载时必须执行某些操作,然后才能使用它。在这一点上很少有理由做很多事情,所以很少有理由使用BEGIN块。如果需要在编译时而不是运行时执行一些代码,则只需要一个BEGIN块 例如:假设在非标准库目录中有一个模块Foo.pm(如/tmp)。您知道,通过修改@INC以包含/tmp,perl可以找到该模块。但

在中的示例中,有一个
BEGIN
块。我查看了一些模块,但没有一个模块有
BEGIN
块。在编写模块时,我应该使用这样的
BEGIN
块吗?还是说它是可有可无的?

模块中的BEGIN块是完全可有可无的。只有在模块加载时必须执行某些操作,然后才能使用它。在这一点上很少有理由做很多事情,所以很少有理由使用BEGIN块。

如果需要在编译时而不是运行时执行一些代码,则只需要一个
BEGIN

例如:假设在非标准库目录中有一个模块
Foo.pm
(如
/tmp
)。您知道,通过修改
@INC
以包含
/tmp
,perl可以找到该模块。但是,这将不起作用:

unshift(@INC, '/tmp');
use Foo;    # perl reports Foo.pm not found
问题是
use
语句在编译时执行,而
unshift
语句在运行时执行,因此当perl查找
Foo.pm
时,include路径尚未修改

实现这一目标的正确方法是:

BEGIN { unshift(@INC, '/tmp') };
use Foo;
现在,
unshift
语句在编译时执行,在
usefoo
语句之前执行

绝大多数脚本不需要
BEGIN
块。在
开始
模块中,可以通过
使用
-ing其他模块获得大量所需内容。例如,在这种情况下,我们可以使用
lib.pm
模块确保
/tmp
位于
@INC
中:

use lib '/tmp';
use Foo;