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

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

Ответ 1

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

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

Ответ 2

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

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

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

Вывод: ([])

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

Обновить - выдержка из программирования Perl 3rd edition, глава 18: Компиляция - компилятор Avant-Garde, ретро-переводчик, стр. 483:

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

/I3az/

Ответ 3

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

NAME

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

СИНТАКСИС

#include <stdlib.h>

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

ОПИСАНИЕ

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