perl - BEGIN 中的 CORE::GLOBAL::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 "Message: " . $message ."\n";
    }
}
eval { die "Right after begin block\n" };
print "done\n";

输出如下,

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

done

BEGIN block 在任何其他语句之前首先执行;但是CORE::Global::die的重定义只有重定义后才有效。 First die 没有使用重新定义的版本,而是使用原始版本。有人可以帮我找出原因吗?

最佳答案

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

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

文件中 BEGIN block 之前的所有代码都在 BEGIN block 运行之前编译,因此第一个 die 调用没有不会被覆盖。

关于perl - BEGIN 中的 CORE::GLOBAL::die 重新定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64033819/

相关文章:

php - 在 PHP 脚本中处理错误并继续执行

java - 我的 while 循环中的条件似乎不正确?

perl - 从 Perl 中的 carp 模块覆盖 croak cluck confess carp

perl - 是否有因子图和积调度的 Perl 实现?

php - 当 php-mysql 脚本失败时如何获得详细的错误报告?

php - 使用 PHP die() 时回显 <div class> 不起作用;

perl - sed/awk/perl 删除 3 行模式的前两行

perl - 如何在 PostgreSQL UPDATE 语句中使用绑定(bind)值?

arrays - Perl 数组与列表

multithreading - Perl 模块 ForkManager 不工作