Perl 核心::全局::开始内部模具重新定义

Perl 核心::全局::开始内部模具重新定义,perl,die,Perl,Die,我有以下代码 print "Starting..\n"; eval { die "Before die sub redefinition\n" }; #die "Before die sub redefinition\n"; BEGIN { print "inside Begin block\n"; *CORE::GLOBAL::die = sub { my ($message) =

我有以下代码

print "Starting..\n";
eval { die "Before die sub redefinition\n" };
#die "Before die sub redefinition\n";
BEGIN {
    print "inside Begin block\n";
    *CORE::GLOBAL::die = sub {
        my ($message) = @_;
        print "Message: " . $message ."\n";
    }
}
eval { die "Right after begin block\n" };
print "done\n";
输出如下:

inside Begin block
Starting..
Message: Right after begin block

done

BEGIN
块在任何其他语句之前首先执行;然而,
CORE::Global::die
的重新定义只有在重新定义之后才有效。第一个
die
不使用重新定义的版本,而是使用原始版本。有人能帮我找出原因吗?

BEGIN
使代码块在编译后立即执行,而不是等待编译阶段完成。这意味着
BEGIN
块中的代码在其他代码执行之前执行,但不一定在其他代码编译之前执行。代码仍然基本上按照所看到的顺序编译

要使
CORE::GLOBAL
覆盖对给定调用生效,它必须在编译该调用时已安装。如果没有重写,那么编译器将发出对内置核心函数的调用

<> >在<代码>开始之前,文件中的所有代码都在开始/<代码>块运行之前编译,所以第一个<代码>模具<代码>调用没有被重写。

,但是如果您想重新定义<代码>模具<代码>,还有一点要考虑。您不一定需要触及
核心::
(尽管处理您无法触及的遗留代码是另一个问题)。您可以在
%SIG
散列中安装
die
(或
warn
)处理程序:

local $SIG{__DIE__} = sub { ... };