/ / Valor de retorno para os blocos BEGIN e INIT? - perl

Valor de retorno para blocos BEGIN e INIT? - perl

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 № 1

Esses 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 de BEGIN ou INIT , 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 um BEGIN ou INIT 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.