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;