Почему Perl запускает блоки END и CHECK в порядке LIFO? - PullRequest
11 голосов
/ 24 августа 2010

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

Ответы [ 3 ]

7 голосов
/ 24 августа 2010

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

Если вы сделали это как-то иначе, это может быть плохие ошибки.

6 голосов
/ 24 августа 2010

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

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

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

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

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

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

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

/ I3az /

1 голос
/ 24 августа 2010

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

ИМЯ

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

СИНТАКСИС

#include <stdlib.h>

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

ОПИСАНИЕ

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...