Я переглядаю (домашній текст) базу коду 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, щоб сказати "зупинити всю програму зараз і дати це значення як процес" статус виходу ". Це буде працювати так само, як всередині aBEGIN
або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 !
що призводить мене до думки, що повернене значення не впливає.
Я просто хотів би більш міцного підтвердження.