我没有深刻或有趣的问题 - 我只是好奇为什么会如此。
答案 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 lead的END
atexit
:
NAME
atexit - 注册一个在进程终止时运行的函数
概要
#include <stdlib.h> int atexit(void (*func)(void));
描述
atexit()
函数应注册func
指向的函数,在正常程序终止时不带参数调用。在正常程序终止时,atexit()
函数注册的所有函数都应按其注册的相反顺序调用...