为什么Perl以LIFO顺序运行END和CHECK块?

时间:2010-08-24 10:41:15

标签: perl compilation

我没有深刻或有趣的问题 - 我只是好奇为什么会如此。

3 个答案:

答案 0 :(得分:7)

假设每个包都依赖于之前的一切正确功能。 END块旨在“清理和关闭”程序包完成之前可能需要处理的任何内容。但是这项工作可能依赖于之前启动的软件包的正确运行,如果允许它们运行其END块,则可能不再适用。

如果你以任何其他方式做到这一点,可能会有不好的错误。

答案 1 :(得分:6)

这是一个可能有用的简单示例:

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

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

输出:([])

如果END是一个FIFO,那么BEGIN/END将无法很好地协同工作。

更新 - 摘自 Programming Perl 第3版,第18章:编译 - 前卫编译器,复古解释器,第483页:< / p>

  

如果文件中有多个END块,它们的执行顺序与它们的定义相反。也就是说,定义的最后一个END块是程序完成时执行的第一个END块。这种反转使得相关的BEGIN和END块能够以您期望的方式嵌套,如果您将它们配对

/ I3az /

答案 2 :(得分:1)

Perl大量借用C和C follows the leadEND atexit

  

NAME

     

atexit - 注册一个在进程终止时运行的函数

     

概要

#include <stdlib.h>

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

描述

     

atexit()函数应注册func指向的函数,在正常程序终止时不带参数调用。在正常程序终止时,atexit()函数注册的所有函数都应按其注册的相反顺序调用...