我正在浏览一个(自制的)Perl代码库,我看到了:
# BEGIN blocks :
BEGIN {
... #do stuff
return 1;
}
#INIT blocks :
INIT {
... #do stuff
return 1;
}
我无法找到BEGIN
或INIT
块中返回值的影响(或缺少影响)的任何信息。
我的问题:
BEGIN
或INIT
块的返回值是否会影响模块的编译或执行?
答案 0 :(得分:1)
此代码块由perl本身执行,类似于子例程,因此调用return只会结束块执行,并忽略值。如果您想使用值退出程序退出。
#!/usr/bin/perl
use 5.010;
BEGIN {exit 0}
say "start";
return 1;
还有另一种方法可以使用$?
,但根据perldoc,它仅适用于END
块。
[ OP评论]
@teodozjan正确地提到你可以通过调用exit
(resp。BEGIN
)块中的INIT
来以某种方式中断编译(resp。启动)过程。
应该注意的是,exit 0
与return 0
的效果完全不同:
return 0
是Perl的语法,用于说明“退出此功能块并将此值传递给调用者”。从BEGIN
或INIT
块调用返回值看起来没什么影响,但是你仍然得到“停止函数执行”部分,并且Perl继续运行(编译/启动)继续前进。)exit 0
是Perl的语法,说“现在暂停整个程序并将此值作为进程'退出状态”。它将在BEGIN
或INIT
块内部以相同的方式工作:Perl将立即停止编译/执行您的程序,退出状态(例如:shell中的$?
)将是0
。顺便说一下,0
是传统的退出状态,说“一切都很顺利”。如果您想发出错误信号,那么您应该exit
以非零状态(或致电croak()
或die()
:退出状态为255)。
答案 1 :(得分:0)
我尝试了以下测试用例:
#file TestModule.pm :
package TestModule;
BEGIN {
print "BEGIN -- TestModule\n";
return 0; # guessing a value which would mean "something went wrong"
}
INIT {
print "INIT -- TestModule\n";
return 0; # guessing a value which would mean "something went wrong"
}
1;
#file test.pl :
#!/usr/bin/perl
use TestModule;
print "Hello!\n";
test.pl脚本愉快地运行:
$ perl test.pl
BEGIN -- TestModule
INIT -- TestModule
Hello !
这让我觉得返回值没有效果。
我想要更强有力的确认。