Estou navegando em uma base de código Perl (escrita em casa) e vejo:
# BEGIN blocks :
BEGIN {
... #do stuff
return 1;
}
#INIT blocks :
INIT {
... #do stuff
return 1;
}
Não consegui encontrar nenhuma informação sobre o efeito (ou a falta dele) do valor de retorno em um BEGIN
ou INIT
quadra.
Minha pergunta :
O valor de retorno de um BEGIN
ou INIT
bloco tem alguma influência na compilação ou execução de um módulo?
Respostas:
1 para resposta № 1Esses blocos de código são executados pelo próprio perl como algo semelhante à sub-rotina, portanto, chamar return apenas finaliza a execução do bloco e o valor é ignorado. Se você deseja sair do programa com valor, use Saída.
#!/usr/bin/perl
use 5.010;
BEGIN {exit 0}
say "start";
return 1;
Também há outra maneira de usar $?
mas de acordo com perldoc está funcionando apenas para END
blocos.
[ Comentário OP ]
O @teodozjan menciona corretamente que você pode, de alguma forma, interromper o processo de compilação (resp. iniciar) chamando exit
no BEGIN
(resp. INIT
) quadra.
Deve-se notar que exit 0
tem um efeito bem diferente do que return 0
Apesar :
return 0
é a sintaxe do Perl para dizer "sair deste bloco de funções e gerar esse valor para o chamador". Parece que o valor de retorno não tem impacto quando você o chama deBEGIN
ouINIT
, mas você ainda obtém a parte "parar a execução da função aqui" e o Perl continua em execução (a compilação / inicialização continua).exit 0
é a sintaxe do Perl para dizer "interrompa todo o programa agora e produz esse valor como o processo" status de saída ". Funcionará da mesma maneira de dentro de umBEGIN
ouINIT
bloco: O Perl para imediatamente de compilar / executar seu programa e o status da saída (por exemplo:$?
em sua concha) será0
.
Btw, 0
é o status de saída convencional para dizer "tudo correu bem". Se você quiser sinalizar um erro, você deve de alguma forma exit
com um status diferente de zero (ou ligue croak()
ou die()
: o status de saída será 255).
0 para resposta № 2
Tentei o seguinte caso de teste:
#file TestModule.pm :
package TestModule;
BEGIN {
print "BEGIN -- TestModulen";
return 0; # guessing a value which would mean "something went wrong"
}
INIT {
print "INIT -- TestModulen";
return 0; # guessing a value which would mean "something went wrong"
}
1;
#file test.pl :
#!/usr/bin/perl
use TestModule;
print "Hello!n";
O script test.pl executa alegremente:
$ perl test.pl
BEGIN -- TestModule
INIT -- TestModule
Hello !
o que me leva a pensar que o valor de retorno não tem efeito.
Eu gostaria apenas de uma confirmação mais forte.