此哈希包含代码引用,这些代码引用在调用各种难以或无法包装的 Perl 关键字时被调用。此哈希的键以被挂钩的关键字命名,后跟两个下划线,然后是一个阶段术语;要么是“before”要么是“after”。
如果您尝试修改未记录存在的键,或者尝试在哈希中存储代码引用或 undef 以外的任何内容,Perl 将抛出错误。如果您希望使用对象来实现挂钩,您可以使用柯里化将对象嵌入到匿名代码引用中。
目前只有一个可以挂钩的关键字,require
,但预计在未来的版本中将有更多支持挂钩的关键字。
${^HOOK}{require__before}
指示的例程由 require
在其检查 %INC
、查找 @INC
、调用 INC 挂钩或编译任何代码 **之前** 调用。它使用单个参数调用,即要加载的项目的文件名(包名将转换为路径)。它可以更改此文件名以更改加载的文件。如果挂钩在执行期间死亡,它将阻止 require 执行。
为了方便在执行 `require` 关键字之前和之后执行共享状态的操作,`require__before` 钩子可以返回一个“操作后”代码引用,该引用将在 `require` 完成时执行。无论 `require` 是否成功完成或抛出异常,此代码引用都将被执行。它将使用被要求的文件名调用。您可以检查 %INC 来确定 `require` 是否成功。`require__before` 钩子的任何其他返回值将被静默忽略。
require__before
钩子按 FIFO 顺序调用,如果钩子返回代码引用,则这些代码引用将按 FILO 顺序调用。换句话说,如果 A 要求 B 要求 C,则 `require__before` 将首先为 A 调用,然后是 B,然后是 C,并且操作后代码引用将首先为 C 执行,然后是 B,最后是 A。
行为良好的代码应确保在设置 `require__before` 钩子时,将调用任何先前安装的钩子,并且如果它们的返回值是代码引用,则也将调用它们的返回值。有关示例实现,请参见 "perlfunc 中的 require"。
${^HOOK}{require__after}
指示的例程由 `require` 在 `require` 完成 **后** 调用。它使用单个参数调用,即被要求的项目的文件名(包名将转换为路径)。当 `require` 完成时执行,无论是通过异常还是通过 `require` 语句的完成,您都可以检查 `%INC` 来确定 `require` 是否成功。
require__after
钩子按 FILO 顺序为每个被要求的文件调用。换句话说,如果 A 要求 B 要求 C,则 `require__after` 将首先为 C 调用,然后是 B,最后是 A。