У меня нет глубокого или интересного вопроса - мне просто любопытно, почему это так.
Предполагается, что каждый пакет полагается на правильное функционирование ВСЕГО, что было до него. Блоки END предназначены для «очистки и закрытия» всего, что может потребоваться пакету до завершения программы. Но эта работа может зависеть от правильного функционирования пакетов, запущенных ранее, что может перестать быть правдой, если им разрешено запускать свои блоки END.
Если вы сделаете это по-другому, могут быть плохие ошибки.
Perl сильно заимствует у C, и END
следует примеру C atexit
:
NAME
atexit - зарегистрировать функцию для запуска при завершении процесса
СИНОПСИС
#include
int atexit (void (* func) (void)); ОПИСАНИЕ
Функция
atexit ()
должна зарегистрировать функцию, на которую указываетfunc
, для вызова без аргументов при нормальном завершении программы. При нормальном завершении программы все функции, зарегистрированные функциейatexit ()
, должны вызываться в порядке, обратном их регистрации…
Вот простой пример, который может помочь:
# 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 /