%{^HOOK}

此哈希包含代码引用,这些代码引用在调用各种难以或无法包装的 Perl 关键字时被调用。此哈希的键以被挂钩的关键字命名,后跟两个下划线,然后是一个阶段术语;要么是“before”要么是“after”。

如果您尝试修改未记录存在的键,或者尝试在哈希中存储代码引用或 undef 以外的任何内容,Perl 将抛出错误。如果您希望使用对象来实现挂钩,您可以使用柯里化将对象嵌入到匿名代码引用中。

目前只有一个可以挂钩的关键字,require,但预计在未来的版本中将有更多支持挂钩的关键字。

require__before

${^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"

require__after

${^HOOK}{require__after} 指示的例程由 `require` 在 `require` 完成 **后** 调用。它使用单个参数调用,即被要求的项目的文件名(包名将转换为路径)。当 `require` 完成时执行,无论是通过异常还是通过 `require` 语句的完成,您都可以检查 `%INC` 来确定 `require` 是否成功。

require__after 钩子按 FILO 顺序为每个被要求的文件调用。换句话说,如果 A 要求 B 要求 C,则 `require__after` 将首先为 C 调用,然后是 B,最后是 A。