CORE::GLOBAL::die 在 BEGIN 中重新定义
CORE::GLOBAL::die redefinition inside BEGIN
我有以下代码
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
覆盖对给定调用产生影响,它必须在编译该调用时已经安装。如果没有覆盖,那么编译器将发出对内置核心函数的调用。
文件中 BEGIN
块之前的所有代码都在 BEGIN
块运行之前编译,因此第一个 die
调用不会被覆盖。
,但是如果要重新定义die
,还有一点需要考虑。您不一定需要接触 CORE::
(尽管处理您无法触及的遗留代码是另一回事)。您可以在 %SIG
哈希中安装 die
(或 warn
)处理程序:
local $SIG{__DIE__} = sub { ... };
我有以下代码
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
覆盖对给定调用产生影响,它必须在编译该调用时已经安装。如果没有覆盖,那么编译器将发出对内置核心函数的调用。
文件中 BEGIN
块之前的所有代码都在 BEGIN
块运行之前编译,因此第一个 die
调用不会被覆盖。
die
,还有一点需要考虑。您不一定需要接触 CORE::
(尽管处理您无法触及的遗留代码是另一回事)。您可以在 %SIG
哈希中安装 die
(或 warn
)处理程序:
local $SIG{__DIE__} = sub { ... };