BEGIN和INIT块的返回值?

时间:2014-12-03 09:20:20

标签: perl

我正在浏览一个(自制的)Perl代码库,我看到了:

# BEGIN blocks :
BEGIN {
    ... #do stuff
    return 1;
}

#INIT blocks :
INIT {
    ... #do stuff
    return 1;
}

我无法找到BEGININIT块中返回值的影响(或缺少影响)的任何信息。

我的问题:
BEGININIT块的返回值是否会影响模块的编译或执行?

2 个答案:

答案 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 0return 0的效果完全不同:

  • return 0是Perl的语法,用于说明“退出此功能块并将此值传递给调用者”。从BEGININIT块调用返回值看起来没什么影响,但是你仍然得到“停止函数执行”部分,并且Perl继续运行(编译/启动)继续前进。)
  • exit 0是Perl的语法,说“现在暂停整个程序并将此值作为进程'退出状态”。它将在BEGININIT块内部以相同的方式工作: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 !

这让我觉得返回值没有效果。

我想要更强有力的确认。