/ / Повернення значення для блоків BEGIN та INIT? - перл

Повертає значення для блоків BEGIN та INIT? - perl

Я переглядаю (домашній текст) базу коду Perl, і я бачу:

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

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

Я не міг знайти будь-яку інформацію про ефект (або його відсутність) поверненого значення в a BEGIN або INIT блок

Моє питання:
Чи повертається значення a BEGIN або INIT блок чи впливає на компіляцію чи виконання модуля?

Відповіді:

1 для відповіді № 1

Цей блок коду виконується perl як щось подібне до підпрограми, тому виклик return просто закінчує виконання блоку, а значення ігнорується. Якщо ви хочете вийти з програми зі значенням Вхід.

#!/usr/bin/perl
use 5.010;

BEGIN {exit 0}

say "start";
return 1;

Також є інший спосіб використання $? але згідно з перлдок це працює лише для END блоки


[ Коментар ОП ]

@teodozjan справедливо зазначає, що ви можете якось перервати процес компіляції (відповідно. запуск), зателефонувавши exit в BEGIN (респ. INIT) блок.

Слід зазначити, що exit 0 має зовсім інший ефект, ніж return 0 хоч:

  • return 0 це синтаксис Perl, щоб сказати "вихід із цього функціонального блоку та передайте це значення вашому абоненту". Схоже, що повернене значення не впливає, коли ви викликаєте його з BEGIN або INIT блок, але ви все одно отримаєте частину "стоп-функції виконання тут", і Perl продовжує працювати (компіляція / запуск продовжується).
  • exit 0 це синтаксис Perl, щоб сказати "зупинити всю програму зараз і дати це значення як процес" статус виходу ". Це буде працювати так само, як всередині a BEGIN або INIT блок: Perl негайно припинить компілювати / виконувати вашу програму та статус виходу (наприклад: $? у вашій оболонці) буде 0.

До речі 0 - це звичайний статус виходу, щоб сказати, "все пішло нормально". Якщо ви хочете повідомити про помилку, вам слід якось exit з ненульовим статусом (або дзвінок) croak() або die() : статус виходу буде 255).


0 для відповіді № 2

Я спробував такий тестовий випадок:

#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";

Сценарій test.pl із задоволенням працює:

$ perl test.pl
BEGIN -- TestModule
INIT -- TestModule
Hello !

що призводить мене до думки, що повернене значення не впливає.

Я просто хотів би більш міцного підтвердження.