2014-12-03 50 views
1

我浏览(家写的)Perl代码的基础上,我看到:BEGIN和INIT块的返回值?

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

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

我找不到返回值的对效果的任何信息(或缺乏)在BEGININIT块。

我的问题:
做了BEGININIT块的返回值有一个模块的编译或执行任何影响?

+0

http://perldoc.perl.org/perlmod.html#BEGIN,-UNITCHECK,-CHECK,-INIT-and-END – teodozjan 2014-12-03 09:31:57

+0

@teodozjan:我读到了,我没有看到任何提及的返回值从'BEGIN/INIT'块中。我错过了什么 ? – LeGEC 2014-12-03 09:52:04

回答

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 ! 

这使我想到的返回值没有任何影响。

我只想更强的确认。

1

这个代码块由Perl本身类似于子程序所以调用返回的东西只是执行结束块执行和值将被忽略。如果您想退出程序,请使用退出

#!/usr/bin/perl 
use 5.010; 

BEGIN {exit 0} 

say "start"; 
return 1; 

也有另一种方式来使用$?但acording到perldoc它是为END块唯一的工作。


[OP评论]

@teodozjan正确地提到,你能以某种中断编译(相应地启动)通过调用BEGIN(RESP。INIT)块exit过程。

应当指出的是,exit 0return 0虽然是很不同的效果:

  • return 0是Perl的语法说:“从这个功能块的出口和产量按您的来电者”。它看起来像返回值,当你从一个BEGININIT块调用它没有影响,但你仍然得到“这里停止功能执行”部分,和Perl保持运行(编译/启动持续使用时间)。
  • exit 0是Perl的语法说“现在停止整个程序,并得到这个值作为进程的退出状态”。它将工作以同样的方式从BEGININIT块中:Perl会立即停止编译/执行程序,并退出状态(如:$?在你的shell)将0

btw,0是传统的退出状态,说“一切正常”。如果你想发出一个错误,你应该以某种方式与exit非零状态(或称croak()die():退出状态将是255)。

+0

感谢您提及这一点。 – LeGEC 2014-12-03 11:39:51