是否覆盖该模块在运行时阶段使用的模块内部函数?

问题描述 投票:1回答:1

让我们简单地讲,

# Foo.pm
package Foo {
  my $baz = bar();
  sub bar { 42 };  ## Overwrite this
  print $baz;      ## Before this is executed
}

无论如何,我可以从test.pl运行代码更改$baz的设置并导致Foo.pm在屏幕上打印其他内容吗?

# maybe something here.
use Foo;
# maybe something here

在编译器阶段是否可以强制以上命令打印7

perl compilation
1个回答
0
投票

这将发出一些警告,但显示7:

sub Foo::bar {}
BEGIN {
    $SIG{__WARN__} = sub {
        *Foo::bar = sub { 7 };
    };
}

首先,我们定义Foo::bar。它的值将由Foo.pm中的声明重新定义,但是将触发“ Subroutine Foo :: bar redefined”警告,该警告将调用再次重新定义该子例程的信号处理程序以返回7。

© www.soinside.com 2019 - 2024. All rights reserved.