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

gvk*_*vkv 11 perl compilation

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

Ian*_*Ian 7

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

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


dra*_*tun 6

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

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

BEGIN { print "[" }
END   { print "]" }
Run Code Online (Sandbox Code Playgroud)

这输出: ([])

如果END是FIFO,那么BEGIN/END就不能很好地协同工作.

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

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

/ I3az /