Почему Perl запускает блоки END и CHECK в порядке LIFO?

У меня нет глубокого или интересного вопроса - мне просто любопытно, почему это так.

11
задан gvkv 24 August 2010 в 10:41
поделиться

3 ответа

Предполагается, что каждый пакет полагается на правильное функционирование ВСЕГО, что было до него. Блоки END предназначены для «очистки и закрытия» всего, что может потребоваться пакету до завершения программы. Но эта работа может зависеть от правильного функционирования пакетов, запущенных ранее, что может перестать быть правдой, если им разрешено запускать свои блоки END.

Если вы сделаете это по-другому, могут быть плохие ошибки.

7
ответ дан 3 December 2019 в 08:28
поделиться

Perl сильно заимствует у C, и END следует примеру C atexit :

NAME

atexit - зарегистрировать функцию для запуска при завершении процесса

СИНОПСИС

 #include 
int atexit (void (* func) (void));

ОПИСАНИЕ

Функция atexit () должна зарегистрировать функцию, на которую указывает func , для вызова без аргументов при нормальном завершении программы. При нормальном завершении программы все функции, зарегистрированные функцией atexit () , должны вызываться в порядке, обратном их регистрации…

1
ответ дан 3 December 2019 в 08:28
поделиться

Вот простой пример, который может помочь:

# perl
BEGIN { print "(" }
END   { print ")" }

BEGIN { print "[" }
END   { print "]" }

Это выводит: ([])

Если END был FIFO, то BEGIN / END не будут работать вместе.

Обновление - отрывок из Программирование на Perl 3-е издание, Глава 18: Компиляция - Компилятор Avant-Garde, Retro Interpreter , стр. 483:

Если у вас их несколько Блоки END внутри файла выполняются в порядке, обратном их определению. То есть последний определенный блок END является первым, выполняемым после завершения вашей программы. Это реверсирование позволяет связанным блокам BEGIN и END размещаться так, как вы ожидаете, если вы объедините их в пары

/ I3az /

6
ответ дан 3 December 2019 в 08:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: